1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TSの鬼 第8回:ユーティリティ型大全―`Pick` / `Omit` / `Partial` を使いこなす

Posted at

はじめに

前回

TypeScript には標準で多数の ユーティリティ型 が用意されている。
これらは型エイリアスやインターフェースを「再発明」せずに再利用するための道具である。本稿では、利用頻度の高い 7 つのユーティリティ型を中心に、書き方・挙動・実務パターン を整理する。

区分 主な用途
部分化 Partial<T> すべてのプロパティをオプショナル化する
必須化 Required<T> すべてのプロパティを必須にする
読み取り専用 Readonly<T> イミュータブルオブジェクトを作る
抽出 Pick<T,K> T からキー K だけを選ぶ
除外 Omit<T,K> T からキー K を除外する
変換 Record<K,V> キー K に値型 V を割り当てる
推論 ReturnType<T> 関数型 T の戻り値型を取得する

1. Partial<T>Required<T>

interface User {
  id: number;
  name: string;
  age?: number;
}

type UserDraft = Partial<User>;    // すべてオプショナル

オプション入力フォームなど、段階的にフィールドが埋まる状況に有効である。

type UserStrict = Required<User>;  // すべて必須

API レスポンスを厳格に検証したい場合や、実験的に age を必須化したいときに便利だ。


2. Readonly<T>

const user: Readonly<User> = {
  id: 1,
  name: "Taro",
  age: 30,
};

// user.name = "Hanako"; // エラー:再代入不可

イミュータブルデータを前提とする Redux や Zustand で安全に扱える。


3. Pick<T,K>Omit<T,K>

3.1 Pick

type UserProfile = Pick<User, "id" | "name">;

UI コンポーネントに必要最低限のプロパティのみを渡す際に役立つ。

3.2 Omit

type UserWithoutId = Omit<User, "id">;

id を自動採番する場合、入力 DTO から id を除外したいときに使用する。


4. Record<K,V>

const roleLabel: Record<"admin" | "user" | "guest", string> = {
  admin: "管理者",
  user: "一般ユーザー",
  guest: "ゲスト",
};

キーと値が 1:1 で対応する辞書型を安全に宣言できる。


5. ReturnType<T>Parameters<T>

function fetchUser() {
  return { id: 1, name: "Taro" } as const;
}

type UserRes = ReturnType<typeof fetchUser>; // 推論で戻り値型を取得

API ラッパを階層化するとき、型を重複定義せずに済む。


6. 実務パターンでの活用

シーン ユーティリティ
入力 DTO とレスポンス DTO を分ける Omit / Pick Omit<User,"id"> で POST 用型を作成
オプション設定を段階的にマージ Partial Partial<Config> としてデフォルトを補完
コンポーネント Props を厳格化 Required / Readonly エンティティを Readonly<Required<T>> に変換
定数マッピング Record Record<Role,string> でラベル辞書型を保証
関数結果を再利用 ReturnType API ハンドラ → Vuex ストア型へ流用

7. 落とし穴と対策

落とし穴 原因 回避策
型がネストしすぎて読めない Pick<Pick<...>> の多重化 エイリアスに切り出し、中間型を命名する
Record<string,unknown> の乱用 キーを限定しない辞書が乱雑 Union リテラルでキーを明示する
Partial による過剰オプション化 バリデーションが不足 zod などのスキーマで必須チェック

まとめ

ユーティリティ型は 「型の再定義」を防ぎ、DRY 原則を型システムで実現 する道具である。設計指針は以下の 3 点に集約される。

  1. 定義済み型から派生させる:新しい型を再発明しない。
  2. 意図を明示するPick / Omit でフィールド選択をドキュメント化。
  3. 複雑化したら名前を付ける:中間エイリアスでコード読解コストを抑制。

次回は 条件付き型と型推論の最適化 をテーマに、型システムをさらに深掘りしていく。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?