javascript - چگونه میتوانم یک نمونه از کلاس Typescript را کپی کنم در حالی که برخی خصوصیات را تغییر میدهم؟


من یک کلاس تایپاسکریپت دارم:

class Cat {
  constructor(
    public name:  string,
    public age:   number,
    public color: string
  ) {}
}

const sophie = new Cat('Sophie', 17, 'black')

حالا میخواهم یک نسخه از نمونه بسازم، اما یک ویژگی را تغییر دهم. اگر این یک شیء واقعی بود، این کار ساده بود:

const tipper = {...sophie, name: 'Tipper'}

اما این یک نمونه از کلاس Cat ایجاد نمیکند. برای انجام این کار، باید هر ویژگی را بهطور طاقتفرسا فهرست کنم:

const Tipper = new Cat('Tipper', sophie.age, sophie.color)

آیا راه تمیزتری برای کپی کردن یک نمونه کلاس وجود دارد، نه شیء لغوی، در حالی که ویژگیهای انتخابشده را تغییر میدهیم؟

پاسخ شماره ۱

میتوانید یک متد کارخانهای ایستا ایجاد کنید که نمونهی جدیدی بر اساس شیء ارسالشده برگرداند

class Cat {
  constructor(...) {...}
  
  static fromObject({ name, age, color }) {
    return new Cat(name, age, color)
  }
}

و سپس شیء sophie را با name بهروزرسانیشده ارسال کنید:

const tipper = Cat.fromObject({ ...sophie, name: "Tipper" })

class Cat {
  constructor(name, age, color) {
    this.name = name;
    this.age = age;
    this.color = color
  }
  
  static fromObject({ name, age, color }) {
    return new Cat(name, age, color)
  }
}

const sophie = new Cat('Sophie', 17, 'black')
const tipper = Cat.fromObject({ ...sophie, name: "Tipper" })

console.log(tipper)
console.log(tipper instanceof Cat)

یا

اگر میتوانید امضای سازنده را تغییر دهید، میتوانید یک شیء را مستقیماً به عنوان آرگومان بگیرید

class Cat {
  constructor({ name, age, color }) {
     ...
  }
}

new Cat({ ...sophie, name: "Tipper" })

class Cat {
  constructor({ name, age, color }) {
    this.name = name;
    this.age = age;
    this.color = color
  }
}

const sophie = new Cat({ name: "Sophie", age: 17, color: "black" })
const tipper = new Cat({ ...sophie, name: "Tipper" })

console.log(tipper)
console.log(tipper instanceof Cat)