これら2つの演算子を使うと、既存の型や値から型を導出できます。これは型レベルプログラミングの基礎となります。
keyof — オブジェクト型のキーのユニオン
ts
interface User { id: number; name: string; }
type UserKey = keyof User; // "id" | "name"
typeof — 値の型
ts
config = { : , : };
= config;
これら2つの演算子を使うと、既存の型や値から型を導出できます。これは型レベルプログラミングの基礎となります。
interface User { id: number; name: string; }
type UserKey = keyof User; // "id" | "name"
config = { : , : };
= config;
typeof を(型の位置で)使うと、ランタイムの値から推論された型を取得できるため、型を別途書き出す必要がありません。
function getProp<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = { id: 1, name: "Ann" };
getProp(user, "name"); // returns string
getProp(user, "age"); // ❌ Error: "age" is not a key of user
ここで K extends keyof T は key を実在するキーに制限し、T[K](インデックスアクセス型)はそのキーに対応する正確な値の型を返します。タイプミスはコンパイルエラーになります。
const Roles = { Admin: "admin", User: "user" } as const;
type Role = typeof Roles[keyof typeof Roles]; // "admin" | "user"
keyof と typeof は値の世界と型の世界をつなぎます。
これらは型安全なプロパティアクセスを支え、設定値や定数からの型導出(単一の信頼できる情報源)を可能にし、マップ型や条件型の構成要素となります。
並行して保守しなければならない型定義を手作業で書く必要をなくしてくれます。