【问题标题】:Typescript generics. Can't pass instance of B to a argument a: T where T extends B. Why?打字稿泛型。不能将 B 的实例传递给参数 a: T where T extends B. 为什么?
【发布时间】:2018-08-29 16:14:25
【问题描述】:

我有课:

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 是满足上述代码 sn-p 的最后一行 T 类型参数的类型。

错误信息:

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

为什么这不起作用? 我是否应该将任何有问题的类型声明更改为 B 而不是 T 并继续继承?

【问题讨论】:

  • if 在 X 类里面?
  • 哦,是的。它在methodB 里面X 类里面

标签: typescript generics parametric-polymorphism subtyping


【解决方案1】:

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

【讨论】:

  • BT extends B 时如何不能成为T 的有效类型?
  • 假设B = {x: string}T = {x: string, y: string}。然后是T extends B,如果this.p.a = {x: "foo"},那么this.p.aB 而不是T
  • 好的。我明白了&lt;T extends B&gt; 意味着 => 任何类型,只要它严格大于B。唔。我如何做到bigger or equal to
  • 不,T extends B 表示类X 的调用者可以选择T 并且可以选择它等于B 或子类型(你称之为“更大”) . X 的实现必须适用于T所有 个有效选择。如果调用者选择的T 的成员数多于B,那么您的代码将不起作用。
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2020-08-22
  • 2019-01-08
  • 2022-06-13
相关资源
最近更新 更多