keyof keyof 演算子
最終更新:2026-10-22
keyof keyof 演算子
keyof T はオブジェクト型 T のすべてのキー名を集め、リテラルユニオン型にします。keyof Settings は "volume" | "theme" です。キー名の型安全の要石であり、ジェネリック制約と組み合わせれば、関数引数のキー名の打ち間違いが即座にエラーになります。
| グループ | ジェネリクス |
|---|---|
| 種類 | 演算子 |
| strict モード | 不要 |
ℹ️ 説明 エディタは TypeScript を JavaScript にトランスパイルして実行します(型チェックなし)。型チェック結果は各サンプルの出力を参照してください。
📝 構文
interface Settings {
volume: number;
theme: string;
}
type SettingKey = keyof Settings; // "volume" | "theme"
function read<T, K extends keyof T>(settings: T, key: K): T[K] {
return settings[key];
}
⚙️ パラメータ
| keyof T | キー名のユニオン:T の全キー名のリテラルユニオン型です(string のインデックスシグネチャがあると string | number に退化します) |
|---|---|
| K extends keyof T | 古典的な組み合わせ:キー名の引数を実際のキーの範囲内に制約します |
| T[K] | インデックスアクセス:キー名に対応する「値の型」で、vol は自動的に number になります |
戻り値:keyof は型の演算子で、実行時コードを生成しません。T[K] が戻り値の型をキー名に正確に連動させます。
▶ サンプル
下のコードを編集して「試す」を押すと、トランスパイル実行結果を確認できます:
出力:
60 dark
(トランスパイル後の実行出力。キー名の打ち間違い("volumn" など)はコンパイルエラーになります——K は keyof T で制約されています)
💡 ポイント
ℹ️ 説明 keyof の結果はオブジェクトの形状に自動追従します。Settings にフィールドを1つ足せば、キーのユニオンにも自動で1項目増えます——手書きの "volume" | "theme" | "lang" には絶対に真似できない同期です。
💡 ヒント keyof + ジェネリックはユーティリティ型の原料です。Pick<T, K extends keyof T> や Omit のシグネチャが、これによって「実在するキーしか選べない」ことを保証しています。
⚠️ 注意 配列の keyof には数値インデックスとすべての配列メソッド名("length" | "push" | ...)が含まれます。配列の要素型を取りたいときは keyof ではなく T[number] を使います。
🏷️ 関連ジェネリクス
💡 関連ケース
ケースは今後追加予定です。
📚 関連チュートリアル
❓ よくある質問
Q keyof typeof obj と keyof Interface に違いはありますか?
A typeof obj はまず「値」を「型」に戻してからキーを取ります(定数オブジェクトでよく使います)。keyof Interface は型に直接キーを取ります。結果は同型のリテラルユニオンです。
Q インデックスシグネチャを持つ型に keyof を使うとどうなりますか?
A { [k: string]: boolean } の keyof は string | number です——キー名はリテラルに絞り込めなくなり、打ち間違い防止の力も失われます。正確なキー名が要るなら、広いインデックスシグネチャを使わないでください。
Q T[K] とは何ですか?
A インデックスアクセス型です。キー型 K で T の対応する値の型を照会します。K = "volume" なら T[K] は number です——キー名と値の型の連動はすべてこれで実現しています。