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: ... }

idcreatedAtなどのサーバー生成フィールドが存在しない作成ペイロードに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型を派生させる必要がある場合に使用します。

試してみる — JSON to TypeScript

フルツールを開く