功能类型的流联合

时间:2017-11-02 13:52:55

标签: javascript node.js flowtype

我正在努力将流程类型添加到JS代码库,并且遇到了一些类似的无类型代码:

const doSomething = (callback, type) => {
    if (type === 'one') {
        const bool = callback(42)
    } else if (type === 'two') {
        const str = callback(4, 2)
    }
}

该函数采用具有两个签名之一的回调,以及一个字符串参数,该字符串指示回调使用哪个签名。

在我第一次尝试添加流程时,我最终得到了以下内容:

/* @flow */

type Callback1 = (any) => bool
type Callback2 = (any, any) => string

type WhichFunc = 'one' | 'two'
type Func = Callback1 | Callback2

const test = (func: Func, which: WhichFunc) => {
  if (which === 'one') {
    const b: bool = func(42)
  } else if (which === 'two') {
    const s: string = func(4, 2)
  }
}

这失败了,不出所料,因为flow无法验证which字符串是否与func有任何关系。

有没有办法在不更改API的情况下添加流类型?

1 个答案:

答案 0 :(得分:1)

你可以像这样做一个明确的(但是很麻烦的)类型转换:

const test = (func: Func, which: WhichFunc) => {
  if (which === 'one') {
    const callback: Callback1 = ((func: any): Callback1);
    const b: bool = callback(42);
  } else if (which === 'two') {
    const callback: Callback2 = ((func: any): Callback2);
    const s: string = callback(4, 2)
  }
};

您还可以在flow.org/try

上看到这一点