嗨,我正在尝试使用Typescript实现活动例程和存储库逻辑。但是在处理泛型类型时遇到了一些问题。
我有一个抽象的BaseModel
,它具有创建方法,该方法返回自身和自身的子类型。为此,我说它将返回BaseModel
。在具有从BaseModel
扩展的泛型类型的存储库中,我包装了我的模型方法,并将泛型用作返回值。但是当我这样做时,它给了我下面的错误。
'BaseModel' is not assignable to type 'T'. 'BaseModel' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'BaseModel'.
当我用Google搜索它时,发现一些答案,例如在重新分配泛型或在嵌套结构中复制时可能会发生。但是我既没有分配东西,也没有一遍又一遍地定义相同的泛型
为什么会出现此类型错误以及如何解决?
这是代码的一部分。
BaseModel.ts
export abstract class BaseModel {
protected constructor(private attributes: any[] = []) {
}
create(attributes: any[] = null): BaseModel {
return this;
}
// ...
}
BaseRepository.ts
export class Repository<T extends BaseModel> {
constructor(private model: T) {
}
create(attributes: any[]): T {
return this.model.create(attributes);
}
// ...
}
答案 0 :(得分:1)
这是因为{URL-encoded-resourceURI}
中的create
返回了BaseModel
,该值不可分配给派生类型(子类型)。它应该返回BaseModel
:
this
有关多态类型的更多信息,here。