泛型类、约束和继承

Generic classes, constraints and inheritance

所以我对 Typescript 和泛型都很陌生。我不确定我是否找到了 bug/limitation 的 Typescript,或者我缺少正确的模式来做我想做的事。

我有一个 Widget 泛型基 class,它包含 T 类型的值。例如,它可以是 stringnumber,随便什么。

我想要一个 Widget subclass 来保存 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 的泛型 class 实际上是 <T> 的数组?目前我必须像这样显式地转换:

this.value = v as U;

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

你可以这样做:

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

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