既存の型のキーを変換して新しい型を生成する高度な型操作
// ── Mapped Type: 既存の型の全プロパティに変換を適用 ──────
type User = { name: string; age: number; email: string };
// 全プロパティをオプションにする(= Partial<T> の実装)
type MyPartial<T> = {
[K in keyof T]?: T[K]; // K が各プロパティ名、T[K] がその値の型
};
// 全プロパティを Readonly にする(= Readonly<T> の実装)
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
};
// ── よく使うカスタムマップ型 ──────────────────────────
// 全プロパティを nullable にする
type Nullable<T> = { [K in keyof T]: T[K] | null };
type NullableUser = Nullable<User>;
// { name: string | null; age: number | null; email: string | null }
// 全プロパティを「フォームフィールドオブジェクト」に変換
type FormFields<T> = {
[K in keyof T]: { value: T[K]; error: string | null };
};
type UserForm = FormFields<User>;
// { name: { value: string; error: string | null }; ... }Mapped TypesはPick/OmitなどのUtility Typesの実装に使われている。Template Literal Typesで文字列の型レベル操作が可能。