インデックスシグネチャは、プロパティ名が事前にわからない場合にそのプロパティの型を記述するもので、キーが動的な辞書やマップをモデル化します。
ts
interface StringMap {
[key: string]: ;
}
: = { : , : };
scores. = ;
scores.;
scores.;
インデックスシグネチャは、プロパティ名が事前にわからない場合にそのプロパティの型を記述するもので、キーが動的な辞書やマップをモデル化します。
interface StringMap {
[key: string]: ;
}
: = { : , : };
scores. = ;
scores.;
scores.;
素のインデックスシグネチャでは、コンパイラはすべてのキーが存在すると見なすため、scores.typo は実行時には実際には undefined であっても number 型として扱われます。noUncheckedIndexedAccess を有効にすると、これが修正されます。
// with noUncheckedIndexedAccess: true
scores.math; // number | undefined → forces you to handle the missing case
interface Config {
name: string; // known property
[key: string]: string | number; // plus arbitrary extra keys
}
名前付きのプロパティはすべて、インデックスシグネチャの値の型に代入可能でなければなりません。
type Scores = Record<string, number>; // same as the index signature
type Roles = Record<"admin" | "user", boolean>; // constrained keys
Record は慣用的な省略形で、制限されたキーのユニオンをサポートします。これは素の [key: string] では実現できません。
インデックスシグネチャは、本当にキーが動的なオブジェクト(ルックアップテーブル、キャッシュ、パースされた JSON マップ)をモデル化します。
安全性に関する注意点(noUncheckedIndexedAccess)を理解し、読みやすさのために Record<K, V> を優先しましょう。そして、キーが本当に自由で、実際の反復処理やサイズのセマンティクスが必要な場合は Map を優先しましょう。