Создание экземпляра этого в TypeScript?

Aug 19 2020

Я не уверен, что это возможно, но это то, чего я пытаюсь достичь ...

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

Возможны ли такие вещи, или мне нужно будет создать breedметод для каждого типа животных?

В ES6 JS вы можете использовать, new this.constructor()но в Typescript это невозможно:

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

выдаст ошибку:

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

Ответы

MBB Aug 19 2020 at 20:46

(property) Object.constructor: Functionis Function , в машинописном тексте вы не можете делать newповерх него, также this.constructorне распознается как значение типа конструктора by TypeScript, но вы можете привести к, anyчтобы получить новый экземпляр. В вашем случае что-то подобное ниже -

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

В JavaScript каждая функция при использовании рассматривается как конструктор, newпоэтому код JavaScript работает нормально без каких-либо проблем.