본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

Pick과 Omit: 원본에서 필요한 속성만 파생하기

~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은 선택한 속성만 남겨

Pick<User, 'id' | 'name'>은 User의 두 속성만 가진 새 타입을 만들어. 두 번째 타입 인자는 keyof User 안에서만 고를 수 있어. 존재하지 않는 이름을 넣으면 오류가 난다. 공개 프로필, 목록 행, 함수가 필요한 최소 입력처럼 원본의 작은 부분에 잘 맞아.

Omit은 선택한 속성만 빼

Omit<User, 'password'>은 password를 제외한 나머지 속성을 유지해. 서버 내부 모델에서 민감 필드나 생성 전에는 없는 필드를 제거한 파생 타입을 만들 때 편리해.

다만 타입에서 필드를 뺐다고 실행 객체에서 값이 사라지는 것은 아니야. User를 SafeUser 타입 변수에 대입해도 원본 객체 안에는 password가 남을 수 있어. 실제 응답에서 제거하려면 구조 분해나 명시적 직렬화가 필요하다.

타입 파생은 실행 데이터 정제와 다르다. 계약과 실제 객체 양쪽에서 같은 필드를 다루는지 확인해.

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 인터페이스에서 id와 createdAt을 뺀 CreateUserInput, email과 password만 남긴 LoginInput을 선언해. 어느 쪽에 Pick과 Omit을 쓸지 선택하고, 두 유틸리티 모두로 표현할 수 있는데도 그 선택이 더 읽기 좋은 이유를 설명해.
Hint
대부분의 필드에서 둘만 뺄 때는 Omit이 간결하고, 필요한 두 필드만 고를 때는 Pick이 분명해. 남기는 목록과 빼는 목록 중 짧은 쪽을 기준으로 골라.

Progress

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

댓글 0

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

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