泛型类、约束和继承
Generic classes, constraints and inheritance
所以我对 Typescript 和泛型都很陌生。我不确定我是否找到了 bug/limitation 的 Typescript,或者我缺少正确的模式来做我想做的事。
我有一个 Widget
泛型基 class,它包含 T
类型的值。例如,它可以是 string
、number
,随便什么。
我想要一个 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"];
这将使您不必再指定额外的通用参数。
所以我对 Typescript 和泛型都很陌生。我不确定我是否找到了 bug/limitation 的 Typescript,或者我缺少正确的模式来做我想做的事。
我有一个 Widget
泛型基 class,它包含 T
类型的值。例如,它可以是 string
、number
,随便什么。
我想要一个 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"];
这将使您不必再指定额外的通用参数。