我正在将流类型添加到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)
  }
}

毫无疑问,这失败了,因为流程无法验证which字符串与func有任何关系。

有没有一种方法可以在此处添加流类型而不更改API?

最佳答案

您可以像这样进行显式(但麻烦)的类型转换:

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上看到此内容

关于javascript - 功能类型的流联合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47077045/

10-11 22:30
查看更多