是否可以在Flow中定义Maybe函数?

时间:2018-01-18 22:29:56

标签: flowtype

我想将参数类型声明为也许是一个默认值为undefined的函数。

但是我收到Flow错误,因为undefinednull都不属于function类型。

有办法吗?

1 个答案:

答案 0 :(得分:1)

这是我实现执行给定函数的函数的方法,除非给定函数未定义:

function maybeExecute<A: *, R>(f: ?(...args: A) => R, ...args: A): ?R {
  if (f) {
    return f(...args)
  }
}

在Flow v0.64.0中进行类型检查。使用?表示f可能是undefinednullif (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的返回值也已定义。