Typescript 错误参数类型为“string |” number” 不可分配给“never”类型的参数

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)[]

Lyu*_*lev 6

您设置的类型bnumber[] | string[]. 这意味着它的类型将是数字数组 ( number[])字符串数​​组 ( string[]) - 这完全取决于初始化变量所用的数据。

\n

当你这样做时:

\n
const b: number[] | string[] = [\'a\', \'b\'];\n
Run Code Online (Sandbox Code Playgroud)\n

实际上,您将其类型设置为string[]- 该变量b现在与数字无关,只是一个字符串数组。

\n

然后你继续做:

\n
const 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 | stringincludes()stringArray<string>

\n
\n

现在,对于另一种情况,您建议:

\n
const b: (number | string)[] = [\'a\', \'b\'];\n
Run Code Online (Sandbox Code Playgroud)\n

这定义了一个 类型的数组number | string,也就是说,它的每个元素都可以是不同的类型 - anumber或 a string。所以你可以有,例如:

\n
const b: (number | string)[] = [1, \'b\'];\n
Run Code Online (Sandbox Code Playgroud)\n

碰巧在您的定义中,所有元素(它们两个)都是相同的类型 - string

\n

现在,当您接到 的电话时includes(),情况就大不相同了。由于您的数组现在可以同时保存数字和字符串,include()因此很乐意使用这两种类型(此数组是Array<number | string>),并且a.x可以是这两种类型。

\n