我有以下代码:一个函数,它从数组中返回一个选项。选项可以是字符串或正则表达式,返回值也会随之变化。
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)];
这很好用。