函数types的stream联合

我正在为JS代码库添加streamtypes,并遇到了一些无types的代码,如下所示:

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

该函数采用具有两个签名中的一个的callback,以及一个types参数,该types参数是指示callback使用哪个签名的string。

在我第一次尝试添加stream程时,我最终得到了以下结果:

 /* @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) } } 

这并不令人吃惊,因为stream程无法validationwhichstring与func有任何关系。

有没有一种方法可以在不改变API的情况下添加streamtypes?

你可以像这样做一个明确的(但繁琐)types转换:

 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🙂上看到这个