Есть ли в TypeScript способ обращения класса к своему конструктору таким образом, чтобы он работал, когда он является подклассом?
abstract class Base<T> {
constructor(readonly value: T) {}
abstract getName(): string;
clone() {
const Cls = this.constructor;
return new Cls(this.value);
}
}
В этом фрагменте Cls
присваивается тип Function
, поэтому компилятор жалуется, что: «Невозможно использовать 'new' с выражением, тип которого не имеет сигнатуры вызова или конструкции».
Typescript не использует строгий тип для конструктора (он просто использует Function
), и, поскольку это не конструктор, его нельзя вызывать с помощью new
.
Простое решение — использовать утверждение типа:
abstract class Base<T> {
constructor(readonly value: T) { }
abstract getName(): string;
clone() {
// Using polymorphic this ensures the return type is correct in derived types
const Cls = this.constructor as new (value: T) => this;
return new Cls(this.value);
}
}