函数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程无法validationwhich
string与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🙂上看到这个