如何在Flow中显式声明参数为普通非箭头函数类型
Flow中声明非箭头函数类型参数的实现方法
可以实现,核心是通过带this类型约束的函数签名过滤箭头函数,原理是箭头函数没有独立的this上下文,不支持自定义this类型标注,只要你为函数参数加上显式的this类型要求,Flow会自动拒绝箭头函数传入。
具体代码实现如下:
// 用泛型绑定obj类型和函数this的类型 function f<T>(g: (this: T) => void, obj: T) { g.call(obj); } // 普通函数调用:类型校验通过 f(function() { console.log(typeof this) }, 42) // 箭头函数调用:Flow会直接抛出类型错误 f(() => { console.log(typeof this) }, 42)
校验规则说明
- 只有普通函数支持通过
this: 类型的语法声明内部this的预期类型,匹配你用call/apply修改this指向的使用场景 - 箭头函数的this固定继承自外层作用域,无法被
call修改,也不支持标注自定义this类型,传入时会触发Flow的类型不匹配报错 - 如果你需要传入的函数带其他参数,直接在this类型后面补充参数定义即可,比如
g: (this: T, arg1: string, arg2: number) => boolean
内容的提问来源于stack exchange,提问作者Steve Bennett
相关产品推荐
相关产品推荐

