JSON生成interfaceにTypeScriptユーティリティ型を適用する
JSONから生成されたinterfaceにPick、Omit、Partial、Requiredを適用する方法を学びます。重複なく特化した型を派生。
Complex Types
詳細な説明
ユーティリティ型による型の派生
JSONから基本interfaceを生成したら、それをそのまますべての場所で使うことはほとんどありません。TypeScriptの組み込みユーティリティ型を使えば、フィールドを繰り返すことなく特化したバリアントを派生できます。
基本Interface(JSONから生成)
interface User {
id: number;
name: string;
email: string;
avatarUrl: string;
role: "admin" | "editor" | "viewer";
createdAt: string;
}
Pick — 特定フィールドの選択
type UserSummary = Pick<User, "id" | "name" | "avatarUrl">;
// { id: number; name: string; avatarUrl: string }
フィールドのサブセットを返すAPIレスポンスや、少数のプロパティのみが必要なコンポーネントpropsにPickを使用します。
Omit — フィールドの除外
type CreateUserInput = Omit<User, "id" | "createdAt">;
// { name: string; email: string; avatarUrl: string; role: ... }
idやcreatedAtなどのサーバー生成フィールドが存在しない作成ペイロードにOmitを使用します。
Partial — 全フィールドをオプショナルに
type UpdateUserInput = Partial<Omit<User, "id" | "createdAt">>;
// { name?: string; email?: string; avatarUrl?: string; role?: ... }
フィールドの任意のサブセットを更新できるPATCHエンドポイントにPartialを使用します。
Required — 全フィールドを必須に
type StrictUser = Required<User>;
すべてのオプショナルフィールドが存在することをバリデーション済みの場合(例:フォーム送信チェック後)にRequiredを使用します。
ユーティリティ型の組み合わせ
精密な制御のためにチェーンできます:
type EditableFields = Partial<Pick<User, "name" | "email" | "avatarUrl">>;
カスタムユーティリティ型
頻繁に使用するパターンには独自の型を定義します:
type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
type UserWithOptionalAvatar = Optional<User, "avatarUrl">;
このアプローチにより、単一の真実の源(JSONからの基本interface)を維持しながら、すべてのバリアントをそこから派生できます。APIが変更された場合、更新するinterfaceは1つだけです。
ユースケース
APIから完全なUser interfaceを持ち、フィールド定義を重複させることなく、異なるエンドポイント用にCreateUser、UpdateUser、UserSummary型を派生させる必要がある場合に使用します。