命名的类型声明之间似乎存在细微的差别function()
语法与匿名函数语法:
type F<X, Y> = (x: X) => Y
// works:
function apply<X, Y>(f: F<X, Y>, x: X) : Y {
return f(x)
}
// works:
const apply0 : <X, Y>(f: F, x: X) => Y = (f, x) => f(x)
// doesn't work
const apply1 : <X, Y>(f: F<X, Y>, x: X) => Y = (f, x) => f(x)
流程控制台片段 https://flowtype.org/try/#0C4TwDgpgBAYgPADQDRQJoD4oF4oAoAeAXFAgJTaaoBQAZgK4B2AxsAJYD2DUAhmGADYhEKDLhrF4yNOhRES5YqigBvKlHVQAThGB1NXGgVJUAvlSacAzsB59BABijFh0sRNnEyFNNjw1Z5FiYhvjGFgzWtgIgAIxOUC6i4rCJMlByXkE+OGIB3iHGVLzRMQTe+FAAVFAATCgA5Nz1xsWCpRVZFdV1UDHG6kA
我需要从任何对类型的引用中删除泛型类型注释F<X, Y>
在匿名者的争论中apply
类型检查器工作的函数。
这是违反直觉的。
[编辑:] 但 Flow 似乎能够进行类型检查apply1
即使未能输入检查也会调用apply1
itself:
apply1(x => x * 2, 'a') // error: ^ string. This type is incompatible with
apply1(x => x * 2, 1) // works
更普遍:
// works:
type Apply<X, Y> = <X, Y>(f: F, x: X) => Y
const apply : Apply = (f, x) => f(x)
// doesn't work:
type Apply1<X, Y> = <X, Y>(f: F<X, Y>, x: X) => Y
const apply1 : Apply1 = (f, x) => f(x)
流程控制台片段 https://flowtype.org/try/#0C4TwDgpgBAYgPADQDRQJoD4oF4oAoAeAXFAgJTaaoBQokUAgmGADYiIobZTtrq4BmxGCiIlyWSjXDRGLEAEYenHEr6DYqkcTIU0VKgGMA9gDsAzsCgBDJqyjFZdnAJHjM-AqUOmL12wvsGf3kuFyh8NygPCP0bOQJdfCgAKigAJhQAcitM8gB6PKgIfEgDYAgAEyKAJ2qjapQAIwBXS1poAwALCAMAazMqONYEiXCU9JR5LyGFEcwk1IyobNyoApq66uszIpKe8orB4LmxxcmvKCggA
我必须删除泛型类型注释X, Y
来自类型别名的参数Apply
对于 Flow 类型检查它。
这是预期的行为还是我错过了什么?