我正在努力将流程类型添加到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)
}
}
这失败了,不出所料,因为flow无法验证which
字符串是否与func
有任何关系。
有没有办法在不更改API的情况下添加流类型?
答案 0 :(得分:1)
你可以像这样做一个明确的(但是很麻烦的)类型转换:
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
上看到这一点