ユーティリティ型 は、既存の型を変換する組み込みの generic な型です。型を再定義する代わりに新しい型を導出できます。これにより型が DRY に保たれ、その元となる型と同期した状態が維持されます。
ts
{ : ; : ; : ; : ; }
<>;
<>;
<>;
<, | >;
<, >;
ユーティリティ型 は、既存の型を変換する組み込みの generic な型です。型を再定義する代わりに新しい型を導出できます。これにより型が DRY に保たれ、その元となる型と同期した状態が維持されます。
{ : ; : ; : ; : ; }
<>;
<>;
<>;
<, | >;
<, >;
// Update endpoint: accept any subset of fields
function update(id: number, changes: Partial<User>) { ... }
update(1, { name: "New" }); // ✅ only the fields you change
// Create endpoint: everything except the server-generated id
type CreateUser = Omit<User, "id">;
User にフィールドを追加すると、これらすべてが自動的に更新されます。忘れてしまうような 2 つ目の定義は存在しません。
Record<string, number>; // { [key: string]: number } — dictionaries
ReturnType<typeof fn>; // the return type of a function
Parameters<typeof fn>; // tuple of a function's parameter types
NonNullable<string | null>; // string (strips null/undefined)
Extract<T, U>; Exclude<T, U>; // filter members of a union
ユーティリティ型を使うと、型の間の関係(「create フォームは user から id を引いたものだ」)を宣言的に表現できます。
これらは重複を減らし、導出された型を元の型と自動的に一貫した状態に保ち、実際のコードベースのいたるところで使われています。特に、更新のための Partial、DTO のための Omit/Pick、マップのための Record が顕著です。