通用类,约束和继承

时间:2016-07-04 16:57:46

标签: generics typescript typescript1.8

所以我对Typescript和generics都很新。我不确定我是否发现了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的泛型类实际上是<T>的数组?目前我必须明确表达:

this.value = v as U;

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

1 个答案:

答案 0 :(得分:2)

你可以这样做:

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"];

它将使您免于必须指定其他通用参数。