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 です——キー名と値の型の連動はすべてこれで実現しています。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%