【问题标题】:Tell typescript compiler not to compile some of the code告诉 typescript 编译器不要编译某些代码
【发布时间】:2017-09-06 21:54:43
【问题描述】:

以下关于泛型的问题:Typescript generics: Argument of type 'X' is not assignable to parameter of type 'T'

下面代码中的get list()protected _list 被添加到每个类中,只是为了有一个正确的类型。但是,当编译为 JavaScript 时,这些方法和类属性在所有三个类中都是相同的。有没有办法告诉 Typescript 编译器跳过重复项并仅在 ClassA 中保留一个 getter/class 属性?

class ClassA {

       protected _list:Array<BlueItem>;

       get list(): Array<BlueItem> {
        return this._list;
    }
}

class ClassB extends ClassA {

       protected _list:Array<GreenItem>;

       get list(): Array<GreenItem> {
        return this._list;
    }
}

class ClassC extends ClassB {

       protected _list:Array<RedItem>;

       get list(): Array<RedItem> {
        return this._list;
    }
}

class BlueItem {

}

class GreenItem extends BlueItem {

}

class RedItem extends BlueItem {

}

【问题讨论】:

  • 这样做有什么好处?

标签: typescript


【解决方案1】:

我认为您可以使用打字稿解决它

class ClassA<T = BlueItem> {

   protected _list:Array<T | BlueItem>;

   get list(): Array<T | BlueItem> {
    return this._list;
   }
}

class ClassB<T = GreenItem> extends ClassA<T | GreenItem> {
}

class ClassC extends ClassB<RedItem> {
}

这不是 100% 等效的,您可以通过将泛型类型限制为需要扩展 BlueItem 或 GreenItem 来进一步更改它,...

【讨论】:

  • 这个问题顶部的链接解释了为什么这种方法不适合。
  • @zeroin 我已经更新了我的示例,如果您希望能够在每个类中设置值,而无需在内部传递构造函数,则需要注意当您读取数据时它可能是T 基类使用的默认泛型。在您传递的泛型中指定数组 / 是在打字稿中允许它的唯一方法
  • 谢谢,这是一个有趣的建议 - 如果您将其发布到原始问题中,这将是最好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2017-03-21
  • 2017-02-13
  • 1970-01-01
  • 2020-12-29
  • 2017-08-18
相关资源
最近更新 更多