【问题标题】:Flow union of function types函数类型的流联合
【发布时间】: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


【解决方案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 上看到这个?

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 2020-02-25
    • 2021-07-03
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-04-19
    • 2020-02-16
    • 2018-01-01
    相关资源
    最近更新 更多