2016-07-04 16 views
1

私はTypescriptやジェネリックスをかなり使い慣れています。私はTypescriptのバグ/制限を見つけたかどうかわからない、または私が欲しいことをするのに正しいパターンがない。一般的なクラス、制約、継承

Tの値を保持するWidget汎用基本クラスがあります。例えば、string,numberなどとすることができる。私は、その値としてArray<T>を保持するWidgetサブクラスを持つようにしたい

、例えば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; 

そしてすべてがうまくいきます(消費コードは期待通りに機能します)。ありがとう!

答えて

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

は、それはあまりにも、追加の一般的なパラメータを指定することからあなたを救うでしょう。

関連する問題