如何在Typescript中约束抽象类的类型

时间:2019-01-30 22:02:14

标签: typescript

这就是我想要做的:

abstract class AbBase
  static newDerived<T extends typeof AbBase>(this: T) {
    return class A extends this {
      //...
    }
  }

基本上,我希望仅从非抽象实现中调用newDerived。

但是,我在extends this部分收到此错误: “类型'T'不是构造函数类型。您是不是要限制T来'新(... args:any [])=> AbBase类型?”

但如果我这样做

  static newDerived<T extends typeof AbBase>(this: new (...args: any[]) => AbstractInstanceType<T>) {

它说:“基本构造函数返回类型'AbstractInstanceType'不是对象类型或对象类型与静态已知成员的交集。”

1 个答案:

答案 0 :(得分:1)

您可以将T约束为返回AbBase的构造函数。这样既可以解决非抽象类的要求,又可以使编译器满意:

abstract class AbBase {
    static newDerived<T extends { new (...a: any[]) : Pick<AbBase, keyof AbBase> } >(this: T) {
        return class A extends this {

        }
    }
}

AbBase.newDerived() // error

class Derived extends AbBase {}
Derived.newDerived() // ok