所以我对Typescript和generics都很新。我不确定我是否发现了Typescript的错误/限制,或者我错过了正确的模式来做我想做的事。
我有一个Widget
通用基类,其类型为T
。例如,它可以是string
,number
,无论如何。
我希望有一个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;
一切都很开心(消费代码按预期工作)。谢谢!
答案 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"];
它将使您免于必须指定其他通用参数。