【发布时间】:2020-11-10 17:03:42
【问题描述】:
我正在使用 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))
但是;如果我在声明/分配b 时使用(number | string)[],它可以正常工作。
我检查了includes (Array<T>.includes(searchElement: never, ...) 的定义文件,但这也没有意义,因为我认为通用的T 将包含number[] | string[]。
如果有人能阐明为什么Array<T> 不涵盖number[] | string[] 而是涵盖(number | string)[],我将不胜感激。
【问题讨论】:
-
number[] | string[]是所有数字的数组或所有字符串的数组。(number | string)[]是一个元素数组,每个元素可以是数字或字符串。任何满足第一个定义的数组都会满足第二个,但反之则不然。 -
@jonrsharpe 感谢您的回复。看来我在代码块中打错了。对于那个很抱歉。问题和代码现在应该更有意义了。那么
a.x不应该与b的每个元素相比较吗?因为它不像单个string与number比较,其结果总是错误的。
标签: typescript generics types