2016-07-04 152 views
1

所以我對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"]; 

我該怎麼規格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"]; 

這將節省您不必太指定一個額外的泛型參數。