【问题标题】:Generic classes, constraints and inheritance泛型类、约束和继承
【发布时间】:2017-02-16 11:46:54
【问题描述】:

所以我对 Typescript 和泛型还很陌生。我不确定我是否发现了 Typescript 的错误/限制,或者我错过了正确的模式来做我想做的事。

我有一个Widget 泛型基类,它包含一个T 类型的值。例如,它可能是stringnumber,等等。

我想要一个Widget 子类,它的值是Array<T>,例如string[]Date[] 等。

示例消费者代码:

let w = new Widget<string>();
w.value = "abc";

let aw = new ArrayWidget<number[]>();
aw.value = [1, 2, 3];

我最接近的是这个:

class Widget<T> {
    public value:T;
}

class ArrayWidget<U extends T[], T> extends Widget<U> {
    setValue() {
        let v = new Array<T>();
        this.value = v; // error: Type 'T[]' is not assignable to type 'U'

    }
}

let aw = new ArrayWidget<string[], string>();
aw.value = ["a", "b", "c"];

如何指定ArrayWidget 的泛型类实际上是&lt;T&gt; 的数组?目前我必须像这样明确地转换:

this.value = v as U;

一切都很顺利(消费代码按预期工作)。谢谢!

【问题讨论】:

    标签: generics typescript typescript1.8


    【解决方案1】:

    你可以这样做:

    class ArrayWidget<T> extends Widget<Array<T>> {
        setValue() {
            let v = new Array<T>();
            this.value = v; // ok
        }
    }
    
    let aw = new ArrayWidget<string>();
    aw.value = ["a", "b", "c"];
    

    这将使您不必指定额外的通用参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多