打字稿泛型。无法将B的实例传递给参数a:T,其中T扩展了B。为什么?

时间:2018-08-29 16:14:25

标签: typescript generics parametric-polymorphism subtyping

我上课:

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 个答案:

答案 0 :(得分:1)

您收到一个错误消息,因为有人可能使用X<T>,其中TB的子类,然后this.p.a可能是一个B不是T。要知道解决错误的最佳方法,我们需要更多地了解您要实现的目标。