我正在使用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))
然而; 如果我要(number | string)[]
在声明/分配时使用b
它,则可以正常工作。
我检查了定义文件中的includes
(Array<T>.includes(searchElement: never, ...
),但这也没有任何意义,因为我认为泛型T
将包含在内number[] | string[]
。
如果有人可以发光为什么Array<T>
不覆盖number[] | string[]
但覆盖,我将不胜感激(number | string)[]
。
您设置的类型b
是number[] | string[]
。这意味着,其类型将是任一数字阵列(number[]
)或字符串数组(string[]
) -它精确地取决于你初始化与所述变量的数据。
当您这样做时:
const b: number[] | string[] = ['a', 'b'];
您实际上将其类型设置为string[]
-此变量b
现在与数字无关,而只是一个字符串数组。
然后,您继续执行以下操作:
const a2 = a1.filter(a => b.includes(a.x));
因此,对于-的每个值(a1
可能是astring
或a)number
,请检查其是否存在于数组中b
。如上所述,b
并且仅是一个字符串数组。并且您不能将number | string
to传递给includes()
,对于此数组,该数组仅需要一个string
参数(此数组为Array<string>
)。因此,编译器错误。
现在,对于另一种情况,您建议:
const b: (number | string)[] = ['a', 'b'];
这定义了一个类型的数组number | string
,也就是说,它的每个元素可以是不同的类型-anumber
或a string
。因此,您可以拥有例如:
const b: (number | string)[] = [1, 'b'];
碰巧在您的定义中,所有元素(它们中的两个)都是相同的类型- string
。
现在,您打到的电话时includes()
,情况就大不一样了。由于您的数组现在可以同时包含数字和字符串,因此include()
可以很高兴地同时使用这两种类型(此数组为Array<number | string>
),并且a.x
可以同时使用这两种类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句