2016-07-04 18 views
1

Also ich bin ziemlich neu in Typescript und auch Generika. Ich bin mir nicht sicher, ob ich einen Fehler/eine Einschränkung von Typescript gefunden habe oder dass mir das richtige Muster fehlt, um das zu tun, was ich will.Generische Klassen, Constraints und Vererbung

Ich habe eine Widget generische Basisklasse, die einen Wert des Typs T enthält. Zum Beispiel könnte es string, number, was auch immer sein.

ich eine Widget Unterklasse haben wollen, die einen Array<T> als Wert halten wird, zB string[], Date[] usw.

Beispiel Verbrauchercode:

let w = new Widget<string>(); 
w.value = "abc"; 

let aw = new ArrayWidget<number[]>(); 
aw.value = [1, 2, 3]; 

Die nächstgelegene ich gekommen bin, ist dies:

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

Wie kann ich spec ify das ArrayWidget 's generische Klasse ist eigentlich ein Array von <T>? Zur Zeit muss ich explizit wie folgt gießen:

this.value = v as U; 

Und alles ist glücklich (der Verbrauchercode funktioniert wie erwartet). Vielen Dank!

Antwort

1

Sie können dies tun:

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

Es wird Sie retten, die zu einer zusätzlichen generischen Parameter angeben.