您需要使用 new 关键字 (new MyModel()) 实例化 MyModel。
您分配了实际的类 (model = MyModel) 而不是它的实例。
另外,你可能想要BaseService generic:
class BaseModel {}
class BaseService<T extends BaseModel> {
protected model: T;
constructor(model: T) {
this.model = model;
}
}
class MyModel extends BaseModel{}
class MyService extends BaseService<MyModel> {
constructor() {
super(new MyModel());
}
}
(code in playground)
编辑
如果您需要类而不是实例,则类似:
class BaseModel {}
type BaseModelConstructor = { new(): BaseModel };
class BaseService {
protected modelCtor: BaseModelConstructor;
}
class MyModel extends BaseModel {}
class MyService extends BaseService {
modelCtor = MyModel;
}
(code in playground)
或者你也可以在这里使用泛型:
class BaseModel {}
type BaseModelConstructor<T extends BaseModel> = { new(): T };
class BaseService<T extends BaseModel> {
protected modelCtor: T;
}
class MyModel extends BaseModel {}
class MyService extends BaseService<BaseModel> {
modelCtor = MyModel;
}
(code in playground)
如果您的派生类具有不同的 ctor 签名,那么您可以在基本 ctor 类型中处理它:
type BaseModelConstructor<T extends BaseModel> = { new(...args: any[]): T };
在这里你可以传递任何数量和种类的参数,但你也可以提供不同的签名:
type BaseModelConstructor<T extends BaseModel> = {
new(): T;
new(str: string): T;
new(num: number, bool: boolean): T;
};
但您也可以为每个派生类使用不同的类型:
type MyModelConstructor = { new(param: string): MyModel };