我想将参数类型声明为也许是一个默认值为undefined
的函数。
但是我收到Flow错误,因为undefined
或null
都不属于function
类型。
有办法吗?
答案 0 :(得分:1)
这是我实现执行给定函数的函数的方法,除非给定函数未定义:
function maybeExecute<A: *, R>(f: ?(...args: A) => R, ...args: A): ?R {
if (f) {
return f(...args)
}
}
在Flow v0.64.0中进行类型检查。使用?
表示f
可能是undefined
或null
。 if (f) { /* ... */ }
检查会缩小f
的类型,以便if
Flow的正文内部可以保证f
是一个函数。
您可以获得一点点发言人并声明多个签名,以使maybeExecute
成为一个重载函数,如下所示:
declare function maybeExecute<A: *, R>(f: (...args: A) => R, ...args: A): R
declare function maybeExecute(f: null | void, ...args: mixed[]): void
function maybeExecute(f, ...args) {
if (f) {
return f(...args)
}
}
如果Flow能够推断出定义了给定函数,则可以使用重载版本,然后它可以推断出maybeExecute
的返回值也已定义。