สร้างอินสแตนซ์จากสิ่งนี้ใน TypeScript หรือไม่

Aug 19 2020

ฉันไม่แน่ใจว่ามันเป็นไปได้ แต่นี่คือสิ่งที่ฉันพยายามจะบรรลุ ...

abstract class Animal<T> {
  breed(mate: Animal<T>) {
    return new [this kind of animal]()
  }
}

class Cat extends Animal<Cat>{
  
}


let cat1 = new Cat();
let cat2 = new Cat();
let kitten = cat1.breed(cat2);

สิ่งนี้เป็นไปได้หรือไม่หรือฉันต้องสร้างbreedวิธีการสำหรับสัตว์ทุกประเภท?

ใน ES6 JS คุณสามารถใช้ได้new this.constructor()แต่ใน typescript ไม่สามารถทำได้:

abstract class Animal<T> {
  breed(mate: Animal<T>) {
    return new this.constructor()
  }
}

จะให้ข้อผิดพลาด:

this expression is not constructable.
Type 'Function' has no construct signatures.

คำตอบ

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functionคือฟังก์ชันใน typescript ที่คุณไม่สามารถทำได้newนอกจากนี้ยังthis.constructorไม่ได้รับการยอมรับว่าเป็นค่าของประเภทตัวสร้างโดยTypeScriptแต่คุณสามารถส่งanyเพื่อรับอินสแตนซ์ใหม่ได้ ในกรณีของคุณคล้ายกับด้านล่าง -

abstract class Animal<T> {
  breed(mate: Animal<T>) {
    return new (<any>this.constructor);
  }
}

ใน JavaScript ทุกฟังก์ชั่นถือเป็นตัวสร้างเมื่อใช้ด้วยnewเหตุนี้โค้ด JavaScript จึงทำงานได้ดีโดยไม่มีปัญหาใด ๆ