Машинописные дженерики. Не удается передать экземпляр B аргументу a: T, где T расширяет B. Почему?

У меня урок:

class X<T extends B> [...]
  // this.p.a :: B | null
  methodA(a: T):void {[...]}

  methodB(): void {
    if(this.p.a){ // :: B
      this.methodA(this.p.a) // Error

Как видите, я передаю T быть любого типа, пока он распространяется B, а затем я передаю ему какое-то свойство указанного типа B, Однако Typescript не может сделать вывод, что B это тип, который удовлетворяет T введите параметр в последней строке приведенного выше фрагмента кода.

Сообщение об ошибке:

error TS2345: Argument of type 'B' is not assignable to parameter of type 'T'.

Почему это не работает? Должен ли я изменить любое оскорбительное объявление типа на B вместо T а реле по наследству?

1 ответ

Решение

Вы получаете ошибку, потому что кто-то может использовать X<T> где T это подкласс B, а потом this.p.a может быть B это не T, Чтобы узнать, как лучше всего устранить ошибку, нам нужно больше узнать о том, чего вы пытаетесь достичь.

Другие вопросы по тегам