类型不能分配给类型“ T”,但是可以用约束类型的其他子类型实例化“ T”

时间:2020-08-05 07:17:30

标签: typescript typescript-typings typescript-generics

嗨,我正在尝试使用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);
  }
  // ...
}

1 个答案:

答案 0 :(得分:1)

这是因为{URL-encoded-resourceURI}中的create返回了BaseModel,该值不可分配给派生类型(子类型)。它应该返回BaseModel

this

Playground

有关多态类型的更多信息,here