Так что я новичок в Typescript, а также в дженериках. Я не уверен, нашел ли я ошибку/ограничение 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;
И все устраивает (потребляющий код работает как положено). Спасибо!