typescript “此表达式不可调用,联合类型的每个成员...都有签名,但这些签名彼此都不兼容,”为什么?

stszievb  于 2022-11-18  发布在  TypeScript
关注(0)|答案(2)|浏览(1085)

如何在typescript中连接union类型的数组?
当我尝试将concat与union类型的数组一起使用时,出现以下错误:

  • 此表达式不可调用。联合类型“{(... items:连接数组〈{...}〉[]):{...}[];(...项:({ ... }|连接数组〈{...;}〉)[]):{ ...;}【】; }|“{...; }”具有签名,但这些签名彼此不兼容.*

代码沙盒:https://codesandbox.io/s/modern-breeze-qt9mb?file=/src/index.ts
程式码范例:

const arr1 = [
  { val1: 1, val2: 2, val3: 3 },
  { val1: 11, val2: 22, val3: 33 }
];

const arr2 = [
  { val1a: "1a", val2a: "2a", val3a: "3a" },
  { val1a: "11a", val2a: "22a", val3a: "33a" }
];

const arr3 = [
  { foo: "lfsfs", bar: "fabgg" },
  { foo: "l414g", bar: "fahrh" }
];

function getRandomArr() {
  if (Math.random() < 0.5) {
    return arr2;
  } else {
    return arr1;
  }
}
//error
const FinalArr = getRandomArr().concat(arr3);
mrfwxfqh

mrfwxfqh1#

你在转移注意力。你的问题***与***“union类型的数组”无关。问题是***所有***你试图concat的数组都有不同类型的元素,而concat要求数组有相同类型的元素T

Array<T> {
    concat(...items: ConcatArray<T>[]): T[];
    concat(...items: (T | ConcatArray<T>)[]): T[];
}

以上是从lib.es5.d.ts
您可以尝试以下代码并了解错误消息,从而快速简化问题并消除转移注意力的内容:

const a = arr1.concat(arr3)   // error
const b = arr2.concat(arr3)   // error

您原来的错误消息还告诉您:联合类型得每个成员...都有签名,但这些签名彼此不兼容.
正如@jsejcksn建议的那样,“使用spread语法来合并数组”,“请参见tsplay.dev/wOzdRW“。这允许您将数组与混合元素类型连接起来:

const FinalArr = [...getRandomArr(), ...arr3];
qvtsj1bj

qvtsj1bj2#

我遇到了这种类型的错误,我没有试图concat,我解决了它在一个简单的,但不是最好的方式,我有两个单独的接口,我使用联合,而不是我结合成一个单一的接口,并使所有的可选,所以它不会通过该领域的利益,但一些数据将被填充,一些未填充,因为所有的是可选的,它将工作正常,而不是联合。

相关问题