Flow-type не сохраняет общий параметр функции при возврате функции

В моем коде я хочу вернуть функцию высокого порядка и передать свой тип аргумента возвращающей функции. Минимальный сокращенный код выглядит следующим образом.

function curry<A, B: A>(a: A): (b: B) => void {
  return () => {}
}

curry(123)("123") // expected error but not

Интересно, почему B не перетекает в возвращающую функцию. Похоже, возвращаемая функция имеет тип (b: any) => void.

Я знаю, что в этом примере я могу изменить тип, связанный с подписью, такой как (a: A) => (b: A) => void. Но мой реальный сценарий более сложен и нуждается в фантомном типе в качестве границы, который выглядит как B выше.

Итак, вопрос в том, для какого типа создается экземпляр B? Могу ли я сделать поток параметра типа в позицию аргумента возвращаемой функции? Может ли тип в позиции аргумента влиять на вывод типа фактического аргумента?


person Herrington Darkholme    schedule 05.10.2016    source источник


Ответы (1)


Возвращаемая функция имеет тип (b: string) => void, как вы можете видеть, выполнив команду type-at-pos.

// @flow

function curry<A, B: A>(a: A): (b: B) => void {
  return () => {}
}

const f = curry(123)
f("123")

запустив flow type-at-pos index.js 7 7, вы получите:

(b: string) => void

Имейте в виду, что из-за того, как работает вывод типов, тип A (и, следовательно, B) изменится соответственно следующим вызовам

const f = curry(123) // <= f now has type (b: string | boolean) => void
f("123")
f(true)
person gcanti    schedule 05.10.2016
comment
Спасибо за ответ на мой первый вопрос. Но мне все еще интересно, почему void выводится, потому что void не является подтипом number. И не могли бы вы уточнить how type inference works? Я не знаю, где я могу найти хорошую ссылку для таких случаев. - person Herrington Darkholme; 06.10.2016