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あたりを覚えるだけで、現場の型コードが驚くほどスッキリします。