Общие классы, ограничения и наследование

Так что я новичок в 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;

И все устраивает (потребляющий код работает как положено). Спасибо!


person orestis    schedule 04.07.2016    source источник


Ответы (1)


Ты можешь это сделать:

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

Это также избавит вас от необходимости указывать дополнительный универсальный параметр.

person David Sherret    schedule 04.07.2016