为什么Flow假定此函数返回RegExp



我有以下代码:一个函数,它从数组中返回一个选项。选项可以是字符串或正则表达式,返回值也会随之变化。

const pick = (options: Array<string | RegExp>): string | RegExp =>
options[Math.floor(Math.random() * options.length)];
const myOptions = ['hello', 'goodbye']
const randomId: string = pick(myOptions);

这引发了以下错误:

无法将pick(...)分配给randomId,因为RegExp[1]与字符串[2]不兼容。Flow(不兼容类型(

为什么会这样?

好的,根据注释构建,这里有几个问题:

  • 数组的类型签名是";字符串或正则表达式的数组;,而不是";字符串数组或正则表达式数组">
  • Flow不知道返回类型是否与所提供的类型匹配,因此函数可能返回一个regex,该regex不能存储在字符串中

使用泛型,我们可以重新定义如下函数:

const pick = <T>(options: Array<T>): T =>
options[Math.floor(Math.random() * options.length)];

这很好用。

最新更新