在 TypeScript 中克隆对象数组

Posted

技术标签:

【中文标题】在 TypeScript 中克隆对象数组【英文标题】:Cloning an array of objects in TypeScript 【发布时间】:2021-01-07 18:56:18 【问题描述】:

我的界面中定义了如下对象数组:

myArray: [
    id: number;
    item: string;
    checked: boolean;
]

我正在尝试使用以下语句克隆数组:

let newArray = myArray.map(x => Object.assign(,x));

当我尝试将新数组分配给原始数组时,出现以下错误:

Type ' id: number; item: string; checked: boolean; []' is not assignable to type
'[ id: number; item: string; checked: boolean; ]'.
  Target requires 1 element(s) but source may have fewer

看起来对象数组正在转换为数组对象。

【问题讨论】:

myArray 被定义为 tuple,而不是 array 类型。你说过它应该只有一个条目。 .map 不做这样的保证。您的初始类型可能是错误的,或者如果您只有一个条目,则不需要 .map myArray: [ id: number; item: string; checked: boolean; ] 更改为 myArray: id: number; item: string; checked: boolean; [] 你们中的一个人应该回答这个问题,而不是评论。 【参考方案1】:

您遇到的问题在于 TypeScript 中元组和列表类型之间的差异。考虑以下示例Playground link:

type AsTuple = [number];

type AsArray = number[];

let myArrayA: AsArray = [];
let myArrayB: AsTuple = []; // This one errors

为什么第二个错误?这是因为AsArray 是一个数字数组,而AsTuple 是一个元组,其中第一个(也是唯一一个)项目是一个数字。空数组不符合AsTuple 类型;它必须是一个单项数组。

在您的示例中,您有:

myArray: [
    id: number;
    item: string;
    checked: boolean;
]

它将myArray 定义为一个元组类型——它可以有一个项目,即一个对象。您可以通过将其设为数组类型来纠正它:

myArray: 
    id: number;
    item: string;
    checked: boolean;
[]

您可以在this playground link 中查看示例。

【讨论】:

以上是关于在 TypeScript 中克隆对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中克隆对象数组?

克隆数组

如何在 JavaScript 中克隆对象数组?

JS----对象的合并与克隆与数组的深浅克隆

使用扩展运算符克隆带有数组的对象

在 Typescript 中过滤嵌套数组对象的数组