用TypeScript编写通用的克隆方法

时间:2019-05-27 12:06:01

标签: typescript

在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'用于其类型缺少调用或构造签名的表达式。”

1 个答案:

答案 0 :(得分:3)

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);
    }
}