สร้างอินสแตนซ์จากสิ่งนี้ใน 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 จึงทำงานได้ดีโดยไม่มีปัญหาใด ๆ