gpt4 book ai didi

javascript - 将子类分配给父类类型的属性

转载 作者:行者123 更新时间:2023-11-30 15:55:58 24 4
gpt4 key购买 nike

我确实有以下 2 个基本类:

class BaseModel {}

class BaseService{
protected model:BaseModel;
}

现在我想为特定用例实现 BaseHelper 和 BaseService 并将派生类分配给我的属性。

class MyModel extends BaseModel{
constructor(param:string){
super();
}
}

class MyService extends BaseService {
model = MyModel;
}

但是,这给了我错误类型'typeof MyModel' is not assignable to type 'BaseModel'。

重要提示:我想附加 MyModel 类,而不是 MyModel 类的实例!

最佳答案

您需要使用 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 )


如果您的派生类具有不同的构造函数签名,那么您可以在基本构造函数类型中处理它:

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

关于javascript - 将子类分配给父类类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38540956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com