Javascript 函数类型的流并集

Javascript 函数类型的流并集,javascript,node.js,flowtype,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) } } 该函数接受具有两个签名之一的回调,以及一个类型参数,该类型参数

我正在将流类型添加到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)
  }
}
这会失败,这并不奇怪,因为流无法验证
哪个字符串与
func
有任何关系

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

您可以这样进行显式(但繁琐)类型转换:

const doSomething = (callback, type) => {
    if (type === 'one') {
        const bool = callback(42)
    } else if (type === 'two') {
        const str = callback(4, 2)
    }
}
const test=(func:func,WhichFunc)=>{
如果(哪一个=='one'){
常量回调:Callback1=((func:any):Callback1);
常数b:bool=回调(42);
}else if(哪个=='two'){
常量回调:Callback2=((func:any):Callback2);
常量s:string=callback(4,2)
}
};

你也可以在我被最初的doSomething函数弄糊涂的时候看到这一点。它不能为我编译(缺少
=
?),而且似乎没有返回值和副作用。它打算做什么?这是一个简化的示例(是的,我缺少了
=
)。关键是它会做一些事情,然后调用回调,但是回调的签名取决于类型参数。