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