2017-02-10 29 views
2

インデックス署名をインデックス署名を表現するためにどのように定義されています。活字体 - 活字体でジェネリック型として

辞書

[key: string]: T 

これらは、いくつかの簡単にラップすることができ

[index: number]: T 

アレイ、再利用可能なタイプ:

type DictionaryIndex<T> = { 
    [key: string]: T 
} 

type ArrayIndex<T> = { 
    [index: number]: T 
} 

これを単一のタイプにまとめたいと思います。私はこれを試してみました:

type Index<TKey extends string|number, TValue> = { 
    [key: TKey]: TValue 
} 

これは、次のエラーのためコンパイルできません:

An index signature parameter must be of type 'string' or 'number'.

は、このことはできませんか?

何のためですか?

foo(obj: Index<string, Bar>) 
foo(obj: Index<string, Bar> & Fooable<string>) 

foo(obj: { [key: string]: Bar }) 
foo(obj: { [key: string]: Bar, canFoo: (foo: string) => Bar }) 
+0

それに関するタイプスクリプトレポには問題があります:https://github.com/Microsoft/TypeScript/issues/13398 まだ可能ではないと思います。 –

答えて

2

クールな質問よりもすっきり見えますので!
私は、実際にはそれが努力の価値がないために実装されていないコンパイラにとって、これは実際には端的なケースであると思います。

インデックスプロパティキーには、明白な数字のみを指定できます。オブジェクトプロパティキーには、文字列または数字のみを使用できます。したがって、最後には制約は、とにかに事実とは何か、そして特別な場合を介してコンパイラによって処理される必要があるものだけを述べます。
だから、再び、私は聖アンダースは、その努力に;-)

を捨てますが、なぜこの

type StrIndex<TValue> = { 
    [key: string]: TValue 
} 

type NumIndex<TValue> = { 
    [key: number]: TValue 
} 

foo(obj: StrIndex<Bar>) 
foo(obj: StrIndex<Bar> & Fooable<string>) 

をしないそれはあなたのソリューションのようにきちんとしていないですが、妥協案として、それは、具体的セットとしてOKと思われることを前提としていXXXIndexタイプの数は2に制限されています