首页 > 解决方案 > typescript - 具有静态方法的抽象类

问题描述

我有一个带有静态方法的类,该方法返回该类的实例(第二个构造函数):


class Node1Model {
  attr1?: string
  attr2?: string

  static fromJsonObj(jsonObj: Node1Json): Node1Model {
    const model = new Node1Model();
    // some extra logic
    model.attr1 = jsonObj.attr1;
    model.attr2 = jsonObj.attr2;
    return model;
  }

}

而且我有一堆遵循相同模式的不同类:它们都有替代的构造函数fromJsonObj

我如何为他们创建一个抽象类?

具体来说,如何指定类上的静态方法应返回同一类的实例?像这样:


abstract class BaseModel<J> {
  static fromJsonObj(jsonObj: J): <WHAT TO PUT HERE?> {
    throw new Error('not implemented');
  }
}

更新

正如这里所建议的,我尝试了以下方法:


class BaseModel {
  static fromJsonObj<T extends typeof BaseModel>(jsonObj: any): InstanceType<T> {
    throw new Error('not implemented');
  }
}

class Node1Model extends BaseModel {
  attr1?: string
  attr2?: string


  static fromJsonObj(jsonObj: any): Node1Model {
    const model = new Node1Model();
    // some extra logic
    model.attr1 = jsonObj.attr1;
    model.attr2 = jsonObj.attr2;
    return model;
  }
}



但这会导致以下错误:

TS2417: Class static side 'typeof Node1Model' incorrectly extends base class static side 'typeof BaseModel'.
  The types returned by 'fromJsonObj(...)' are incompatible between these types.
    Type 'Node1Model' is not assignable to type 'InstanceType<T>'.

标签: javascripttypescript

解决方案


推荐阅读