[TYPESCRIPT] Record, Exclude, Extract, NonNullable 정리 — 실무에서 자주 쓰는 타입 변환 도구

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은 nullundefined를 제거하여 실제 값 타입만 남기도록 보장합니다.

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 제거

이 네 가지 유틸리티 타입을 제대로 이해하면 불필요한 타입 선언을 줄이고, 더 안전하고 완성도 높은 타입 설계가 가능합니다.