javascript - 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>'.
解决方案
推荐阅读
- javascript - Json 应该通过按钮按下显示在 html 表上,但没有任何反应
- sql - 我需要替换sql中的值
- javascript - node.js 中的 voicestateupdate 存在问题
- hyperledger-fabric - 恐慌:运行时错误:索引超出范围当使用 genesis.block 启动排序器时
- c# - c# 和 Excel Range:如何打印到输出范围
- ruby-on-rails - 在 Rails 中使用通配符访问参数
- docker - 如何在 docker 容器中为 appveyor 服务器 docker 构建运行 docker 命令?
- c# - OnPropertyChanged 有时不会更新 ListView 中的 UI,仅在滚动或其他活动之后
- typescript - Aurelia CLI 项目构建错误取决于环境
- c# - Azure IoT Hub:使用 C# 解决方案的“onChangeStatus”触发器