Тип не может быть назначен типу 'T', но 'T' может быть создан с другим подтипом ограничения Тип - PullRequest
1 голос
/ 05 августа 2020

Привет, я пытаюсь реализовать активную подпрограмму и журнал репозитория c с машинописным текстом. Но возникли некоторые проблемы с общими c типами.

У меня есть аннотация BaseModel, в которой есть метод create, который возвращает себя и подтип самого себя. Для этого я сказал, что он вернет BaseModel. В репозитории, который имеет общий тип c, расширенный от BaseModel, я обернул свои методы модели и использовал общий тип c в качестве возвращаемого значения. Но когда я это делаю, это дает мне ошибку ниже.

'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'.

Когда я погуглил, нашел некоторые ответы, как это может произойти при повторном назначении generi c или дублировании в вложенные структуры. Но я не назначаю что-то и не определяю один и тот же generi c снова и снова

Почему я получаю эту ошибку типа и как ее решить?

Вот часть кода .

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 Ответ

1 голос
/ 05 августа 2020

Это потому, что create of BaseModel возвращает BaseModel, который не может быть назначен производному типу (подтипу). Он должен вернуть this:

create(attributes: any[] = null): this { ...

Playground

Подробнее о polymorphi c this типов здесь .

...