Utility type은 기존 타입을 변환하는 내장 generic 타입으로, 타입을 다시 정의하는 대신 새 타입을 파생시킵니다. 타입을 DRY하게 유지하고 원본과 동기화시킵니다.
ts
{ : ; : ; : ; : ; }
<>;
<>;
<>;
<, | >;
<, >;
Utility type은 기존 타입을 변환하는 내장 generic 타입으로, 타입을 다시 정의하는 대신 새 타입을 파생시킵니다. 타입을 DRY하게 유지하고 원본과 동기화시킵니다.
{ : ; : ; : ; : ; }
<>;
<>;
<>;
<, | >;
<, >;
// Update 엔드포인트: 필드의 임의 부분집합을 받음
function update(id: number, changes: Partial<User>) { ... }
update(1, { name: "New" }); // ✅ 변경할 필드만
// Create 엔드포인트: 서버가 생성하는 id를 제외한 전부
type CreateUser = Omit<User, "id">;
User에 필드를 추가하면 이들 모두가 자동으로 갱신됩니다 — 잊어버릴 두 번째 정의가 없습니다.
Record<string, number>; // { [key: string]: number } — 딕셔너리
ReturnType<typeof fn>; // 함수의 반환 타입
Parameters<typeof fn>; // 함수 매개변수 타입의 tuple
NonNullable<string | null>; // string (null/undefined 제거)
Extract<T, U>; Exclude<T, U>; // union의 멤버를 필터링
Utility type은 타입 간의 관계("create 폼은 user에서 id를 뺀 것")를 선언적으로 표현하게 해줍니다.
중복을 줄이고, 파생 타입을 원본과 자동으로 일관되게 유지하며, 실제 코드베이스 어디에나 있습니다 — 특히 update에는 Partial, DTO에는 Omit/Pick, map에는 Record가 그렇습니다.