¿Creando una instancia de esto en TypeScript?

Aug 19 2020

No estoy seguro de que esto sea posible, pero esto es lo que estoy tratando de lograr ...

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

¿Es posible este tipo de cosas o necesitaría crear un breedmétodo para cada tipo de animal?

En ES6 JS puede usar, new this.constructor()pero en Typescript esto no es posible:

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

dará un error:

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

Respuestas

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functiones Función , en el mecanografiado no se puede hacer newencima de él, tampoco this.constructorse reconoce como valor del tipo de constructor TypeScript, pero se puede convertir anypara obtener la nueva instancia. En su caso, algo similar a lo siguiente:

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

En JavaScript, cada función se considera un constructor cuando se usa con, newpor lo tanto, el código JavaScript funciona bien sin problemas.