javascript – 多态匿名函数类型别名
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 多态匿名函数类型别名,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1669字,纯文字阅读大概需要3分钟。
内容图文
似乎命名函数()语法与非同义函数语法的类型去除之间存在细微差别:
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)
我需要从对F< X,Y>类型的任何引用中删除泛型类型注释.在匿名应用函数的参数中,类型检查器可以工作.
这是违反直觉的.
[编辑:]但似乎Flow能够键入check apply1调用,即使它无法键入check 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)
我必须从类型别名的参数中删除泛型类型注释X,Y Apply for Flow来检查它.
这是预期的行为还是我错过了什么?
解决方法:
TL; DR:试试
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 – 多态匿名函数类型别名全部内容,希望文章能够帮你解决javascript – 多态匿名函数类型别名所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。