TypeScript에는 객체 타입과 유니온 타입을 쉽고 안전하게 변환할 수 있도록 다양한 유틸리티 타입이 제공됩니다. 그중에서 Record, Exclude, Extract, NonNullable은 유니온 타입과 객체 타입을 다루는 데 매우 강력한 도구입니다.
Record - 객체 타입을 일정 규칙으로 생성하기
Record는 Key 유니온 + Value 타입을 기반으로 객체 타입을 생성합니다.
type Roles = "admin" | "user" | "guest";
type UserRecord = Record<Roles, string>;
// { admin: string; user: string; guest: string }
다음과 같은 상황에서 실무적으로 많이 사용됩니다:
- 권한별 설정값 매핑
- Locale 메시지 테이블 구성
- enum 기반 설정 객체 정의
const roleNames: UserRecord = {
admin: "관리자",
user: "사용자",
guest: "게스트",
};
Exclude - 유니온 타입에서 특정 타입 제거
Exclude는 유니온 타입에서 제거하고 싶은 타입을 제외하여 새 타입을 생성합니다.
type Status = "loading" | "success" | "error";
type NonError = Exclude<Status, "error">;
// "loading" | "success"
주로 다음과 같은 상황에 유용합니다:
- 에러 상태를 제외하고 처리 가능한 상태만 타이핑
- 특정 값만 빼고 선택 가능하도록 제한
Extract - 유니온 타입에서 특정 타입만 추출
Extract는 유니온 타입 중 특정 조건에 맞는 타입만 골라 내는 기능입니다. Exclude와 정반대 개념입니다.
type Status = "loading" | "success" | "error";
type OnlyError = Extract<Status, "error">;
// "error"
조건 타입과 결합하면 더욱 강력해집니다:
type Types = string | number | boolean;
type OnlyNumber = Extract<Types, number>;
// number
NonNullable - null과 undefined 제거
NonNullable은 null과 undefined를 제거하여 실제 값 타입만 남기도록 보장합니다.
type MaybeUser = { id: number } | null | undefined;
type User = NonNullable<MaybeUser>;
// { id: number }
API 응답, 폼 입력값, optional 데이터 처리에서 널리 쓰입니다.
function process(user: NonNullable<MaybeUser>) {
return user.id;
}
네 가지 유틸리티 타입 비교 요약
| 타입 | 설명 | 주 사용 사례 |
|---|---|---|
| Record<K, T> | K key 각각에 대해 value 타입 T를 가진 객체 생성 | 설정·권한 테이블·enum 매핑 |
| Exclude<T, U> | T에서 U에 해당하는 타입 제거 | 특정 상태 제거, 허용되지 않는 타입 차단 |
| Extract<T, U> | T에서 U와 일치하는 타입만 추출 | 특정 타입만 선별해 처리 |
| NonNullable<T> | null과 undefined 제거 | API 응답/optional 데이터 보정 |
실무 응용 패턴
enum과 Record 조합
enum LogLevel {
INFO = "info",
ERROR = "error",
}
const LOG_COLOR: Record<LogLevel, string> = {
info: "blue",
error: "red",
};
Exclude를 활용한 함수 오버로드 안전 처리
type Event = "click" | "scroll" | "resize";
type PassiveEvent = Exclude<Event, "resize">;
Optional API 응답 보정 (NonNullable)
type Response = { user: User | null };
type SafeUser = NonNullable<Response["user"]>;
Extract로 특정 타입만 분기 처리
type P = string | number | boolean;
type StringOrBoolean = Extract<P, string | boolean>;
Record, Exclude, Extract, NonNullable은 간단해 보이지만 도메인 타입 관리, API 구조, 유니온 타입 분기 처리에서 매우 큰 역할을 합니다.
- Record → 규칙 기반 객체 타입 생성
- Exclude → 제외
- Extract → 선택
- NonNullable → null/undefined 제거
이 네 가지 유틸리티 타입을 제대로 이해하면 불필요한 타입 선언을 줄이고, 더 안전하고 완성도 높은 타입 설계가 가능합니다.
'개발 > Typescript' 카테고리의 다른 글
| [TYPESCRIPT] 조건부 타입(Conditional Type) — 타입에 따라 분기하는 고급 타입 설계 (0) | 2025.12.15 |
|---|---|
| [TYPESCRIPT] infer 키워드로 타입 추론하기 — 조건부 타입의 핵심 메커니즘 (0) | 2025.12.14 |
| [TYPESCRIPT] Partial, Pick, Omit, Required 유틸리티 타입 활용 — 실무에서 가장 많이 쓰이는 타입 변환 패턴 (0) | 2025.12.12 |
| [TYSCRIPT] 제네릭 제약조건(extends) 사용법 — 타입 안정성을 높이는 핵심 기법 (0) | 2025.12.10 |
| [TYPESCRIPT] 제네릭 함수와 클래스 활용하기 - 재사용성과 타입 안정성을 모두 잡는 방법 (0) | 2025.12.09 |
