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: Function関数です。typescriptでは、そのnew上で実行することはできません。また、this.constructorによってコンストラクタ型の値として認識されませTypeScriptんが、にキャストしanyて新しいインスタンスを取得できます。あなたの場合、以下のようなもの-

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

JavaScriptでは、すべての関数を一緒に使用するとコンストラクターと見なされるnewため、JavaScriptコードは問題なく正常に機能します。