C.W.K.
Stream
Lesson 02 of 05 · published

`Pick<T, K>` 와 `Omit<T, K>`

~8 min · utility-types, pick, omit, subset

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"유지할 거 알면 Pick. 떨굴 거 알면 Omit."

`Pick` — 특정 key 선택

Pick<User, 'id' | 'email'> 가 그 두 필드만 가진 새 타입 만들어. 두 번째 parameter K 가 `keyof T` 로 제약, 그래서 존재 안 하는 key 요청 못 함. 결과 타입이 선택된 필드만 가지고, 원래 타입 유지.

Interface 의 subset 노출하고 싶을 때 유용 — 예: 전체 User 모양의 subset 인 public profile.

`Omit` — 특정 key 제거

Omit<User, 'password'> 가 그 필드 없는 새 타입 만들어. 남은 필드가 타입 유지. 민감 subset 빼고 전부 원할 때 유용 — client 반환 전 `password` strip, API 전송 전 `internal_id` strip.

어느 거 선택할 때

둘 다 같은 연산에 유효; 더 짧은 list 가진 거 골라. 20 중 3개 원하면 Pick 이 더 명백. 20 중 17개 원하면 Omit 이 더 잘 읽혀.

또한: Pick 이 key typo 하면 큰 소리로 실패 (constraint 가 잡음). Omit 은 strict mode 에서만 큰 소리로 실패 — 없으면 존재 안 하는 key omit 이 조용히 허용.

Pick 과 Omit 이 역 연산. 함께 타입 property 의 어떤 subset 이든 원본의 변환으로 묘사하게 해. Subset 수동 re-type 대신 써 — refactor-safe.

Code

Pick 과 Omit, 거울 연산·typescript
interface User {
  id: number;
  name: string;
  email: string;
  password: string;
  createdAt: Date;
}

// Pick — 특정 key 선택.
type PublicProfile = Pick<User, 'id' | 'name'>;
// { id: number; name: string }

// Omit — 특정 key 제거.
type SafeUser = Omit<User, 'password'>;
// { id: number; name: string; email: string; createdAt: Date }

function toPublic(u: User): PublicProfile {
  return { id: u.id, name: u.name };
}

function sanitize(u: User): SafeUser {
  const { password, ...rest } = u;
  return rest;
}

External links

Exercise

위 User interface 주어지면, 2 타입 선언: idcreatedAt 뺀 User 인 CreateUserInput, 그리고 emailpassword 만인 LoginInput. 어느 게 Pick 쓰고 어느 게 Omit? 둘 다 양쪽에 유효 — 너의 선택 설명.
Hint
CreateUserInput → Omit (all-minus-two 원함). LoginInput → Pick (둘만 원함). 선택이 list 크기에 달림.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.