[key: string]: T インデックスシグネチャ
最終更新:2026-10-22
[key: string]: T インデックスシグネチャ
インデックスシグネチャは「キー名が固定されていないが、キーの値の型は統一されている」オブジェクトを記述します。例えば辞書、カウンタ、設定マッピングなどです。書き方は [key: string]: T です。
| グループ | 型の組み合わせ |
|---|---|
| 種類 | 構文 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
const dict: { [key: string]: number } = {};
dict["a"] = 1;
// 等価なユーティリティ型の書き方
const same: Record<string, number> = {};
⚙️ パラメータ
| [key: string] | キーの型は string、number、symbol またはそのユニオンのみ指定でき、key の名前は自由に付けられます |
|---|---|
| [i: number] | [i: number]: T は「添字で値を取得する」構造を記述します。数値インデックスの値の型は、文字列インデックスの値の型のサブタイプでなければなりません |
戻り値:戻り値はありません。インデックスシグネチャは純粋な型レベルの概念であり、実行時コードを一切生成しません。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
180 0
(トランスパイル後の実行出力。scores["Bob"] の型は number で、strict 下でもエラーになりません。インデックスシグネチャは「すべてのキーが存在する」と宣言しているからです)
💡 ポイント
ℹ️ 説明 Record<string, number> とインデックスシグネチャ { [key: string]: number } は意味が同じで、ユーティリティ型の書き方がより一般的です。
⚠️ 注意 インデックスシグネチャは「どんなキー」も合法にします。strict 下でも scores["Bob"] はエラーにならず、タイプミスが見過ごされます。キー名の集合が限られているなら Record<"a" | "b", T> やマップ型に切り替えましょう。
💡 ヒント 値の型が統一されていないならユニオンで書きます。{ [key: string]: string | number } のようにし、読み取った後に型でナローイングます。
🏷️ 関連型の組み合わせ
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q インデックスシグネチャと Record<K, V> の関係は何ですか?
A 表現力は等価で、Record は本質的にマップ型で実装されたインデックスシグネチャです。日常では Record の方が簡潔で、キーの集合をリテラルユニオンに限定することもできます。
Q 存在しないキーにアクセスしてもエラーにならないのはなぜですか?
A インデックスシグネチャの意味は「すべての string キーが存在し、型は T である」だからです。コンパイラにタイプミスを検出させたいなら、Record<"a" | "b", T> でキー名を限定するか、noUncheckedIndexedAccess を有効にします。
Q 数値インデックスと文字列インデックスは共存できますか?
A できますが、数値インデックスの値の型は文字列インデックスの値の型のサブタイプでなければなりません(JS では数値のキーは最終的に文字列のキーになります)。