Skriva en generisk kloningsmetod i TypeScript
I TypeScript, finns det ett sätt för en klass att referera till sin konstruktor på ett sätt som fungerar när den är subklasserad?
abstract class Base<T> {
constructor(readonly value: T) {}
abstract getName(): string;
clone() {
const Cls = this.constructor;
return new Cls(this.value);
}
}
I detta utdrag ges Cls typen Function och därför klagar kompilatorn på: "Kan inte använda 'new' med ett uttryck vars typ saknar en anrops- eller konstruktionssignatur."
Svar #1
Typescript använder inte en strikt typ för konstruktorn (den använder bara Function) och eftersom detta inte är en konstruktor, kan den inte anropas med new.
Den enkla lösningen är att använda en typförsäkran:
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);
}
}
