【发布时间】:2018-04-15 01:55:37
【问题描述】:
我正在向 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 的情况下在此处添加流类型?
【问题讨论】:
-
我对原来的 doSomething 函数感到困惑。它不能为我编译(缺少
=?),而且它似乎没有返回值,也没有副作用。它的目的是什么? -
这是一个简化的例子(是的,我错过了
=)。关键是它做了一些事情然后调用了一个回调,但是回调的签名取决于类型参数。
标签: javascript node.js flowtype