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