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 , typescript에서 할 수없는 new것은 또한 this.constructor생성자 유형의 값으로 인식되지 TypeScript않지만 any새 인스턴스를 얻기 위해 캐스트 할 수 있습니다 . 귀하의 경우 아래와 비슷한-

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

JavaScript에서 모든 함수는 함께 사용될 때 생성자로 간주 new되므로 JavaScript 코드는 문제없이 잘 작동합니다.