Typescript接口变量克隆

5

我知道typescript中的interface是一种类型,所以如果我定义了一个interface,我可以用它来定义一个变量。我的问题是,有没有任何(预定义的)方法可以复制interface中的变量?例如:

interface Person {
  name: string;
  birthday: string;
}
let person: Person = <Person>{};
person.name = "bob";
person.birthday = "19000909";
console.dir(person);
let copyPerson: Person = <Person>{};
copyPerson = person;
copyPerson.name = "Alice";
//then the person's name is also Alice. because the reference of person is passed to copyPerson.

当我修改 copyPerson 后,person 也会发生变化。我知道可以将 person 的每个属性赋值给 copyPerson,但是否有一种方法可以制作一个独立的 person 副本?(顺便说一下,如果是类,我可以使用 new 创建一个对象)

4个回答

15

您可以使用Object.assign

let copyPerson = Object.assign({}, person);
copyPerson.name = "Alice";

console.log(person); // {name: "bob", birthday: "19000909"}
console.log(copyPerson); //  {name: "Alice", birthday: "19000909"}

有没有办法使用getter和setter方法使其工作?我的接口定义了具有getter和setter的属性,我只想从接口中克隆getter和setter。 - James Joshua Street
@JamesJoshuaStreet 不要使用 Object.assign,请在此处阅读更多内容:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Description - Nitzan Tomer

1

我遇到了类似的问题,所以我会发布一些我发现的内容来帮助其他人:

如果你的对象包含子对象。当你使用Object.asign()时,子对象的引用将被复制,你最终会遇到同样的问题,但只是针对子对象。

因此,在对父对象使用Object.assign()之后,你必须为每个子对象使用另一个Object.assign(),因为它将复制引用。

你也可以使用这种方法来克隆对象和子对象:

let originalObject = 
{
    a:'a', 
    b:'b', 
    subObj:
    {
        c:'c',
        d:'d',
    },
};
//clone object
let cloneObject = {...originalObject};
//clone sub object
cloneObject.subObj = {...originalObject.subObj};
//now modification on cloneObject and its sub-object won't occure in originalObject

扩展运算符也可以用于数组: let clonedArray = [...originalArray];

0

如何克隆数组或对象:

克隆一个数组:

const clonedArray  = Object.assign([], myArray);

克隆一个对象:

const clonedObject = Object.assign({}, myObject);

0

const object: CustomType = {customkey: "customValue"}

const cloneObject = {...object} as CustomType;

这应该适用于您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接