はじめに
前回
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 点に集約される。
- 定義済み型から派生させる:新しい型を再発明しない。
-
意図を明示する:
Pick
/Omit
でフィールド選択をドキュメント化。 - 複雑化したら名前を付ける:中間エイリアスでコード読解コストを抑制。
次回は 条件付き型と型推論の最適化 をテーマに、型システムをさらに深掘りしていく。