Adventure Time - Finn 3
본문 바로가기
프론트

TypeScript 유틸리티 타입(Utility Types)

by hyun9_9 2026. 4. 11.

기존 타입을 변환하고 조합하는 내장 유틸리티 타입들을 정리합니다.


기본 인터페이스

아래 예시들은 모두 이 User 인터페이스를 기반으로 합니다.

interface User {
  id: number;
  name: string;
  age: number;
  gender?: "m" | "f";
}

1. keyof

객체 타입의 모든 키를 유니온 타입으로 추출합니다.

type UserKey = keyof User;  // "id" | "name" | "age" | "gender"

const uk: UserKey = "age";     // ✅ OK
const uk2: UserKey = "email";  // ❌ Error — User에 없는 키

💡 keyof는 유틸리티 타입은 아니지만, Record나 Pick 등과 함께 자주 쓰이는 핵심 연산자입니다.


2. Partial<T>

모든 프로퍼티를 옵셔널(?)로 변환합니다. 일부 프로퍼티만 가진 객체를 만들 때 유용합니다.

let admin: Partial<User> = {
  id: 1,
  name: "Bob"
  // age, gender 없어도 ✅ OK
}

Partial<User>는 아래와 동일한 효과입니다.

interface User {
  id?: number;
  name?: string;
  age?: number;
  gender?: "m" | "f";
}

3. Required<T>

Partial의 반대입니다. 모든 프로퍼티를 필수로 변환합니다. 옵셔널이었던 프로퍼티도 반드시 포함해야 합니다.

let admin: Required<User> = {
  id: 1,
  name: "Bob"
  // ❌ Error — age와 gender가 빠져 있음
}

💡 원본 User에서 gender는 옵셔널이었지만, Required<User>에서는 필수가 됩니다.


4. Readonly<T>

모든 프로퍼티를 읽기 전용으로 만듭니다. 생성 이후 값을 수정하려 하면 에러가 발생합니다.

let admin: Readonly<User> = {
  id: 1,
  name: "Bob",
  age: 30,
}

admin.id = 4;  // ❌ Error — 읽기전용 프로퍼티는 수정 불가

5. Record<K, T>

키 타입(K)과 값 타입(T)을 지정하여 새로운 객체 타입을 만듭니다.

기본 사용

type Grade = "1" | "2" | "3" | "4";
type Score = "A" | "B" | "C" | "D";

const score: Record<Grade, Score> = {
  1: "A",
  2: "B",
  3: "C",
  4: "D",
}

Grade에 정의된 모든 키가 존재해야 하고, 각 값은 반드시 Score 타입이어야 합니다.

keyof와 조합

function isValid(user: User) {
  const result: Record<keyof User, boolean> = {
    id: user.id > 0,
    name: user.name !== "",
    age: user.age > 0,
    gender: !!user.gender,
  };
  return result;
}

Record<keyof User, boolean>은 User의 모든 키를 가지되, 값은 boolean인 객체를 만듭니다.


6. Pick<T, K>

특정 타입에서 원하는 프로퍼티만 골라 새 타입을 만듭니다.

const admin: Pick<User, "id" | "name"> = {
  id: 0,
  name: "Bob",
  // age, gender는 포함할 수 없음
}

7. Omit<T, K>

Pick의 반대입니다. 특정 타입에서 지정한 프로퍼티를 제외한 나머지로 새 타입을 만듭니다.

const admin: Omit<User, "age" | "gender"> = {
  id: 0,
  name: "Bob",
  // age, gender가 제외됨
}

💡 Pick vs Omit: 남길 프로퍼티가 적으면 Pick, 제거할 프로퍼티가 적으면 Omit이 편합니다.


8. Exclude<T1, T2>

유니온 타입에서 특정 타입을 제외합니다. Omit이 객체의 프로퍼티를 제거한다면, Exclude는 유니온의 멤버를 제거합니다.

type T1 = string | number | boolean;
type T2 = Exclude<T1, number>;
// T2 = string | boolean

9. NonNullable<T>

유니온 타입에서 null과 undefined를 제거합니다.

type T1 = string | number | boolean | null | undefined;
type T2 = NonNullable<T1>;
// T2 = string | number | boolean

한눈에 보기

유틸리티 문법 설명

keyof keyof User 모든 키를 유니온으로 추출
Partial Partial<User> 모든 프로퍼티를 옵셔널로
Required Required<User> 모든 프로퍼티를 필수로
Readonly Readonly<User> 모든 프로퍼티를 읽기 전용으로
Record Record<K, T> 키-값 타입으로 객체 생성
Pick Pick<User, "id"> 원하는 프로퍼티만 선택
Omit Omit<User, "age"> 특정 프로퍼티를 제외
Exclude Exclude<T1, number> 유니온에서 특정 타입 제외
NonNullable NonNullable<T1> null · undefined 제거

'프론트' 카테고리의 다른 글

TypeScript 제네릭(Generic)  (0) 2026.04.11
TypeScript 클래스(Class)  (0) 2026.04.11
TypeScript 리터럴 · 유니온 · 교차 타입 정리  (0) 2026.04.11
TypeScript 함수 타입  (0) 2026.04.11
TypeScript 인터페이스(Interface)  (0) 2026.04.11