TypeScriptは、すべてのキーを事前に定義することができない場合に、動的なプロパティ名を持つオブジェクトを記述することを許可します。これには、変数オブジェクトの型付けのための方法として登場したインデックスシグネチャが使用されます(マップ、外部サーバーのデータなど)。
インデックスシグネチャがない場合、オブジェクトは事前に指定されたキーのみで認識され、他のキーはコンパイルエラーを引き起こします。同時に、シグネチャの不適切な宣言は、オブジェクトのすべてのプロパティのタイプを曖昧にし、タイプの厳密さを低下させ、バグを引き起こす可能性があります。
明示的にインデックスシグネチャを宣言するのは、正当化される場合のみ行ってください。文字列キーに基づいたオブジェクトの配列の型付けには、次の形式を使用してください:
コードの例:
interface Dictionary { [key: string]: number; length?: number; } const sample: Dictionary = { apples: 4, oranges: 10 }; sample['bananas'] = 6;
主な特徴:
インデックスシグネチャで異なるキーに異なる値の型を指定できますか?
いいえ、タイプはすべてのキーのセットで同じである必要があります。もし[key: string]: numberを指定した場合、sample.lengthもnumberでなければなりません:これはインデックスシグネチャと既知のプロパティを併用する場合によくエラーを引き起こします。
インデックスシグネチャをシンボル(symbol)で使用できますか?
はい、ES6以降TypeScriptはシンボルによるインデックスシグネチャをサポートしています:
interface SymbolMap { [key: symbol]: string; }
インデックスシグネチャを持つオブジェクトを、異なる型の追加プロパティと共に宣言するとどうなりますか?
プロパティの型がインデックスシグネチャで宣言された値の型と互換性がない場合、コンパイラはエラーを出します。これはユニオンタイプを使用するか、そのようなフィールドを別のインターフェースに移動することで回避できます。
サーバーからの任意の応答にインターフェース{[key: string]: any}が使用されており、データ構造の制御を失うことで予期しないバグを引き起こしました。
利点:
欠点:
辞書に対してのみインデックスシグネチャを厳密に使用し、既知のプロパティにはシグネチャの外で型を明示的に宣言します。
利点:
欠点: