多态匿名函数类型别名

2024-01-05

命名的类型声明之间似乎存在细微的差别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 类型检查它。

这是预期的行为还是我错过了什么?


长话短说:尝试一下

const apply1 = <X, Y>(f: F<X, Y>, x: X): Y => f(x)

解释

首先,正如 @squint 在评论中提到的,F没有类型参数隐式意味着F<any, any>, 这就是为什么apply0在你的例子中有效。

那么为什么你的apply1有错误吗?嗯,这是因为 Flow 不推断泛型。所以当你写的时候

const apply1 : <X, Y>(f: F<X, Y>, x: X) => Y = (f, x) => f(x)

作业的右侧是

(f, x) => f(x)

Flow 无法推断出该箭头函数是多态的。因此,您可以像这样向 RHS 添加类型参数:

const apply1 : <X, Y>(f: F<X, Y>, x: X) => Y = <X, Y>(f: F<X, Y>, x: X): Y => f(x)

这应该可以修复错误。但此时,左侧的类型注释不再需要。所以你可以将其简化为

const apply1 = <X, Y>(f: F<X, Y>, x: X): Y => f(x)

进一步阅读

Avik Chaudhuri 写了一个简短的解释类似的堆栈溢出问题 https://github.com/facebook/flow/issues/2165#issuecomment-236868389,这又链接到GitHub 上有类似的答案 https://github.com/facebook/flow/issues/2165#issuecomment-236868389

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多态匿名函数类型别名 的相关文章

随机推荐