在我的代码中,我想返回一个高阶函数并将我的参数类型传递给返回函数。最小缩减代码如下所示。
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
实例化的是什么类型?我可以将类型参数流转换为返回函数的参数位置吗?参数位置中的类型是否会影响实际参数的类型推断?
答案 0 :(得分:4)
返回的函数的类型为(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)