In TypeScript davon instanziieren?

Aug 19 2020

Ich bin mir nicht sicher, ob dies möglich ist, aber das versuche ich zu erreichen ...

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

Ist so etwas möglich oder müsste ich breedfür jede Tierart eine Methode erstellen ?

In ES6 JS könnten Sie verwenden, new this.constructor()aber in Typescript ist dies nicht möglich:

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

wird einen Fehler geben:

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

Antworten

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functionis Function , In Typoskript, das Sie nicht newdarüber hinaus ausführen können , wird auch this.constructornicht als Wert des Konstruktortyps von erkannt TypeScript, aber Sie können umwandeln any, um die neue Instanz abzurufen. In Ihrem Fall etwas Ähnliches wie unten -

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

In JavaScript wird jede Funktion als Konstruktor betrachtet, wenn sie verwendet wird. newDaher funktioniert der JavaScript-Code ohne Probleme.