javascript - 函数类型的流联合

标签 javascript node.js flowtype

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

相关文章:

javascript - 没有指定路径!无法得到亲戚。 gulp 任务中的 Vinyl-fs 错误

javascript - 虚线将图表上的空值转换为零

javascript - window.XXX = require(YYY) VS const {XXX} = require(YYY) : which to use?

javascript - 在 Jade/Pug 中渲染对象数组

git - 我应该在 git 中保留 flow-typed/npm 文件夹版本吗?

javascript - 路径长度变化时保持 stroke-dasharray 一致

javascript - jQuery 验证 - 仅当另一个字段被填充时才需要字段

javascript - Express+pug 中的动态 URL

javascript - 是不是类似于 Flow 中 TypeScript 的非空断言运算符?

javascript - 无法对迭代器上可能未定义的值调用函数