gpt4 book ai didi

javascript - 多态匿名函数类型别名

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:00:53 25 4
gpt4 key购买 nike

命名 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)

Flow console snippet

我需要从任何对类型的引用中删除泛型类型注释 F<X, Y>在匿名的参数中 apply类型检查器工作的功能。

这是违反直觉的。

[编辑:]但似乎 Flow 能够输入检查 apply1即使无法键入检查也会调用 apply1本身:

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)

Flow console snippet

我必须删除通用类型注释 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 在 similar stack overflow question 上写了一个简短的解释,它又链接到一个 similar answer on GitHub

关于javascript - 多态匿名函数类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38814690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com