grk*_*kmk 3 generics types typescript
我正在使用 Typescript 编写一段代码,并遇到了以下问题,我无法理解为什么会发生这种情况。
下面的代码块Argument of type 'string | number' is not assignable to parameter of type 'never'
在编译时触发错误。
interface A {
x: number | string
}
const a1: A[] = [{x: 1}, {x: 'a'}]
const b: number[] | string[] = ['a', 'b']
const a2 = a1.filter(a => b.includes(a.x))
Run Code Online (Sandbox Code Playgroud)
然而; (number | string)[]
如果我在声明/分配时使用b
,它工作得很好。
includes
我检查了( )的定义文件Array<T>.includes(searchElement: never, ...
,但这也没有意义,因为我认为泛型T
将包含number[] | string[]
.
如果有人能解释为什么Array<T>
不覆盖number[] | string[]
但覆盖,我将不胜感激(number | string)[]
。
您设置的类型b
是number[] | string[]
. 这意味着它的类型将是数字数组 ( number[]
)或字符串数组 ( string[]
) - 这完全取决于初始化变量所用的数据。
当你这样做时:
\nconst b: number[] | string[] = [\'a\', \'b\'];\n
Run Code Online (Sandbox Code Playgroud)\n实际上,您将其类型设置为string[]
- 该变量b
现在与数字无关,只是一个字符串数组。
然后你继续做:
\nconst a2 = a1.filter(a => b.includes(a.x));\n
Run Code Online (Sandbox Code Playgroud)\n因此,对于a1
- 的每个 value\xd0\xb5 (可能是 astring
或 a )number
,您检查它是否存在于 array 中b
。如上所述,它只是b
一个字符串数组。并且您不能将 a 传递给,对于该数组,它只需要一个参数(该数组是)。因此出现编译器错误。number | string
includes()
string
Array<string>
现在,对于另一种情况,您建议:
\nconst b: (number | string)[] = [\'a\', \'b\'];\n
Run Code Online (Sandbox Code Playgroud)\n这定义了一个 类型的数组number | string
,也就是说,它的每个元素都可以是不同的类型 - anumber
或 a string
。所以你可以有,例如:
const b: (number | string)[] = [1, \'b\'];\n
Run Code Online (Sandbox Code Playgroud)\n碰巧在您的定义中,所有元素(它们两个)都是相同的类型 - string
。
现在,当您接到 的电话时includes()
,情况就大不相同了。由于您的数组现在可以同时保存数字和字符串,include()
因此很乐意使用这两种类型(此数组是Array<number | string>
),并且a.x
可以是这两种类型。