기존 타입을 변환하고 조합하는 내장 유틸리티 타입들을 정리합니다.
기본 인터페이스
아래 예시들은 모두 이 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 |