Skip to content

6.4 keyof型とlookup型

この節で紹介する機能はTypeScriptの中でも比較的高度な部類に入りますが、使いこなせると型情報の再利用性が高まり、非常に強力な武器となります。

オブジェクト型から、特定のプロパティの型を抽出(参照)する機能です。

  • 構文: T[K]T はオブジェクト型、K はプロパティ名の文字列リテラル型など)。
  • 挙動: 例えば Human["age"] と書くと、Human 型の age プロパティの型(number など)が得られます。
  • メリット: オブジェクトの定義(例: agebigint に変更されるなど)が変わっても、lookup 型を使っていれば自動的に追従されるため、型情報を重複して書く必要がなくなり(DRY原則)メンテナンス性が向上します。

オブジェクト型から、そのオブジェクトが持つすべてのプロパティ名を文字列リテラル型のユニオン型として取得する機能です。

  • 構文: keyof T
  • 挙動: Human 型が nameage プロパティを持つ場合、keyof Human"name" | "age" という型になります。
  • 値から型を作るテクニック: オブジェクトの変数 obj に対して、keyof typeof obj とすることで、「その変数が持つキー名のユニオン型」を動的に生成し、引数などをそのオブジェクトの有効なキーのみに制限するパターンがよく使われます。

6.4.3 keyof型とlookup型とジェネリクス

Section titled “6.4.3 keyof型とlookup型とジェネリクス”

keyoflookup 型は、型引数(ジェネリクス)と組み合わせることでさらに真価を発揮します。

  • 安全なプロパティ取得: function get<T, K extends keyof T>(obj: T, key: K): T[K] のような関数を定義できます。
  • 制約(extends)の重要性: K extends keyof T という制約があることで、TypeScriptは「K は必ず T のプロパティ名のどれかである」と確信でき、結果として T[K] という戻り値の型を安全に推論・許可してくれます。

オブジェクトのキー名が数値(例: 0: string)で定義されている場合、keyof は文字列リテラルだけでなく数値リテラル型のユニオン型(例: 0 | 1)を返すことがあります。

  • 未知の型のキー: 一般に、未知の型 T に対する keyof T は、string | number | symbol の部分型として扱われます。
  • 文字列に限定したい場合: キーが確実に文字列であることを保証したい場合は、K extends keyof T & string のようにインターセクション型を用いて制限を加えるテクニックが有効です。