【问题标题】:Typescript interface variable cloneTypescript 接口变量克隆
【发布时间】:2017-05-07 20:10:56
【问题描述】:

我知道打字稿的interface是一个Type,所以如果我定义一个接口,我可以用它来定义一个变量。我的问题是,是否有任何(预定义的)方法来复制接口的变量?例如:

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,但是有什么方法可以单独复制一个人吗? (顺便说一句,如果是类,我可以new一个对象)

【问题讨论】:

    标签: typescript interface


    【解决方案1】:

    你可以使用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
    • @JamesJoshuaStreet 不与Object.assign 合作,请在此处阅读更多信息:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    【解决方案2】:

    刚刚遇到了同样的问题,所以我将发布我发现的内容以帮助我的情况:

    如果您的对象包含子对象。当您使用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];

    【讨论】:

      【解决方案3】:

      克隆一个数组或对象:

      克隆一个数组:

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

      克隆一个对象:

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

      【讨论】:

        【解决方案4】:

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

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

        这应该适合你。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          • 2023-03-15
          • 2017-02-11
          • 2016-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多