如何在Typescript中连接两个ReadonlyArrays?

时间:2017-08-08 01:11:54

标签: arrays typescript typescript2.0

什么是在ReadonlyArray s中打字的两个数组的推荐方法?请考虑以下事项:

const strings1: ReadonlyArray<string> = ["foo"];
const strings2: ReadonlyArray<string> = ["bar"];

const allStrings = strings1.concat(strings2);

在这种情况下,我在strings2方法的concat参数中收到编译错误:

TS2345: Argument of type 'ReadonlyArray<string>' is not assignable to parameter of type 'string | string[]'. Type 'ReadonlyArray<string>' is not assignable to type 'string[]'. Property '[Symbol.unscopables]' is missing in type 'ReadonlyArray<string>'.

如果我查看concatReadonlyArray的输入内容,这有一定道理:

concat(...items: (T | T[])[]): T[];

这感觉就像疏忽一样,因为当您使用ReadonlyArray时,将两个ReadonlyArray结合起来似乎是常见的事情。我错过了什么,或者是否有一个我错过的明显解决方案?

我看到的解决方案是:

  1. 扩展ReadonlyArray类型以添加​​我想要的定义
  2. 将我的ReadonlyArray投射到普通数组:strings1.concat(strings2 as string[])
  3. 在结束前先创建一个新的普通数组:strings1.concat([].concat(strings2))
  4. 我正在使用Typescript 2.4.2。

2 个答案:

答案 0 :(得分:5)

使用点差运算符:

const strings1: ReadonlyArray<string> = ["foo"];
const strings2: ReadonlyArray<string> = ["bar"];

const allStrings = [...strings1, ...strings2];

答案 1 :(得分:4)

已在Typescript 2.5.1中修复,请参阅https://github.com/Microsoft/TypeScript/issues/17076