Instanciando isso no TypeScript?

Aug 19 2020

Não tenho certeza se isso é possível, mas é isso que estou tentando alcançar ...

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

Esse tipo de coisa é possível ou eu precisaria criar um breedmétodo para cada tipo de animal?

Em ES6 JS você poderia usar, new this.constructor()mas em Typescript isso não é possível:

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

dará um erro:

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

Respostas

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functionis Function , In typescript você não pode fazer newem cima dele também this.constructornão é reconhecido como valor do constructor type by TypeScript, mas você pode lançar to anypara obter a nova instância. No seu caso, algo semelhante ao abaixo -

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

Em JavaScript, cada função é considerada um construtor quando usada com, newportanto, o código JavaScript está funcionando bem sem problemas.