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コードは問題なく正常に機能します。