Contoh dari ini di TypeScript?

Aug 19 2020

Saya tidak yakin ini mungkin, tetapi inilah yang saya coba capai ...

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);

Apakah hal semacam ini mungkin, atau apakah saya perlu membuat breedmetode untuk setiap jenis hewan?

Di ES6 JS Anda dapat menggunakan new this.constructor()tetapi di Ketikan ini tidak mungkin:

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

akan memberikan kesalahan:

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

Jawaban

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functionadalah Fungsi , Dalam skrip ketikan yang tidak dapat Anda lakukan newdi atasnya juga this.constructortidak dikenali sebagai nilai jenis konstruktor TypeScript, tetapi Anda dapat mentransmisikan ke anyuntuk mendapatkan contoh baru. Dalam kasus Anda, sesuatu yang mirip dengan di bawah ini -

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

Dalam JavaScript setiap fungsi dianggap sebagai konstruktor saat digunakan dengan newdemikian kode JavaScript berfungsi dengan baik tanpa masalah.