TypeScriptのユーティリティ型10選|実務で使える型テクニック

プログラミング言語

TypeScriptには、型を組み立てる「ユーティリティ型」が標準で多数用意されています。これらを使いこなせば、型定義を簡潔・安全に保てます。本記事では、実務で頻出するユーティリティ型10選を紹介します。

1. Partial<T>

すべてのプロパティをオプショナルに。フォーム入力や更新APIの型定義で頻出。

type User = { id: number; name: string; email: string };
type UserUpdate = Partial<User>;
// { id?: number; name?: string; email?: string }

2. Required<T>

type Config = { host?: string; port?: number };
type FullConfig = Required<Config>;
// { host: string; port: number }

3. Readonly<T>

type User = { id: number; name: string };
type FrozenUser = Readonly<User>;
const u: FrozenUser = { id: 1, name: 'A' };
// u.name = 'B'; // エラー

4. Pick<T, K>

type User = { id: number; name: string; email: string };
type UserSummary = Pick<User, 'id' | 'name'>;
// { id: number; name: string }

5. Omit<T, K>

type User = { id: number; name: string; password: string };
type PublicUser = Omit<User, 'password'>;

6. Record<K, V>

type Status = 'success' | 'error' | 'pending';
type Color = Record<Status, string>;
// { success: string; error: string; pending: string }

7. ReturnType<T>

function fetchUser() {
  return { id: 1, name: 'A' };
}
type User = ReturnType<typeof fetchUser>;

8. Parameters<T>

function createUser(name: string, age: number) {}
type Args = Parameters<typeof createUser>;
// [string, number]

9. Awaited<T>

type P = Promise<{ name: string }>;
type Data = Awaited<P>;
// { name: string }

10. NonNullable<T>

type MaybeUser = User | null | undefined;
type DefinedUser = NonNullable<MaybeUser>;
// User

組み合わせの例

// 更新APIのリクエスト型:id以外をPartialに
type UpdateUserRequest = { id: number } & Partial<Omit<User, 'id'>>;

まとめ

TypeScriptのユーティリティ型は、型を再利用しながら安全に変形する強力な道具です。Partial・Pick・Omit・ReturnType・Awaitedあたりを覚えるだけで、現場の型コードが驚くほどスッキリします。