Instancier à partir de cela dans TypeScript?

Aug 19 2020

Je ne suis pas sûr que ce soit possible, mais c'est ce que j'essaie de réaliser ...

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

Est-ce que ce genre de chose est possible ou devrais-je créer une breedméthode pour chaque type d'animal?

Dans ES6 JS, vous pouvez utiliser new this.constructor()mais dans Typescript ce n'est pas possible:

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

donnera une erreur:

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

Réponses

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functionis Function , En typographie que vous ne pouvez pas faire newpar dessus, this.constructorn'est pas non plus reconnu comme valeur de type constructeur par TypeScript, mais vous pouvez effectuer un cast anypour obtenir la nouvelle instance. Dans votre cas, quelque chose de similaire à ci-dessous -

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

En JavaScript, chaque fonction est considérée comme un constructeur lorsqu'elle est utilisée avec, par newconséquent, le code JavaScript fonctionne correctement sans aucun problème.