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

Typescript generics. Can't pass instance of B to a argument a: T where T extends B. Why?

我有 class:

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 并继承继承?

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