2016-07-04 2 views
1

Так что я довольно новичок в TypScript, а также дженериках. Я не уверен, нашел ли я ошибку/ограничение TypScript или мне не хватает правильного шаблона, чтобы делать то, что я хочу.Общие классы, ограничения и наследование

У меня есть базовый класс 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"]; 

Как я могу чертежу ify, что общий класс ArrayWidget - это массив из <T>? В настоящее время я должен быть явно подобран следующим образом:

this.value = v as U; 

И все доволен (код потребления работает должным образом). Благодаря!

ответ

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

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

Смежные вопросы