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

Partial과 Required: 선택 속성을 한꺼번에 바꾸기

~8 min · utility-types, partial, required, optionality

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"원본 타입의 불완전한 버전과 완전한 버전을 손으로 다시 적지 말고 관계로 만들어."

Partial은 모든 속성을 선택 사항으로

Partial<T>는 T의 각 속성에 ?를 붙인 새 타입을 만들어. User 전체가 아니라 바뀔 필드만 받는 수정 요청, 기본 설정 위에 일부만 덮는 옵션, 작성 중인 폼 상태에 잘 맞아.

원본 속성 이름과 값 타입을 그대로 따라가므로 User에 필드가 추가되면 Partial 버전에도 자동으로 반영돼. 같은 모양을 선택 속성으로 다시 손으로 적는 것보다 변경에 강하다.

Required는 반대 방향

Required<T>는 선택 속성에서 ?를 제거해 모두 필수로 만들어. 입력 단계에서는 일부 설정이 비어 있을 수 있지만 기본값을 적용한 뒤에는 모든 값이 존재한다고 표현할 때 유용해.

Required라고 적는 것만으로 실행 중 빈 값이 채워지는 것은 아니야. 실제 병합이나 검증을 수행한 뒤 그 결과 타입으로 사용해야 해. 타입 변환은 데이터 변환의 증거가 아니라 계약의 표현이니까.

둘 다 얕게 작동해

Partial<{ user: User }>는 user 속성 자체만 선택 사항으로 만들고 User 안쪽 속성은 건드리지 않아. 깊은 변환이 필요하면 재귀 매핑 타입을 만들 수 있지만, 도메인의 모든 층을 정말 선택 사항으로 만들어도 되는지 먼저 물어. 깊은 Partial은 잘못된 중간 상태를 너무 많이 허용할 수 있어.

Partial<T>{ [K in keyof T]?: T[K] }라는 매핑된 타입으로 모든 키를 순회해 선택 사항으로 만들어. 자세한 매핑 규칙은 Type Manipulation 트랙에서 다루고, 여기서는 기존 계약의 부분 업데이트 모양을 복제 없이 파생한다는 점을 기억해.

원본과 파생 타입의 관계를 유틸리티로 보존하되, 실제 데이터가 그 단계에 도달했다는 증거는 코드로 만들어.

Code

Partial 과 Required 나란히·typescript
interface User {
  id: number;
  name: string;
  email: string;
}

// Partial — 모든 필드 optional.
type UserPatch = Partial<User>;
// { id?: number; name?: string; email?: string }

function updateUser(id: number, patch: UserPatch) {
  // patch 가 필드의 어떤 subset 이든 가질 수.
}

updateUser(1, { name: 'Pippa' });               // ✅
updateUser(1, { name: 'Pippa', email: '...' }); // ✅
updateUser(1, {});                              // ✅ — 빈 거 괜찮음

// Required — 반대.
interface Config {
  host?: string;
  port?: number;
  protocol?: 'http' | 'https';
}

type CompleteConfig = Required<Config>;
// { host: string; port: number; protocol: 'http' | 'https' }

function setup(cfg: CompleteConfig) {
  // cfg.host 등 존재 보장
}

External links

Exercise

theme, fontSize, locale을 필수로 갖는 Settings와 기본 설정 값을 정의해. overrides: Partial<Settings>를 받아 기본값 위에 덮어쓰고 완전한 Settings를 반환하는 merge 함수를 만든 다음, 없는 키를 넘기면 컴파일러가 거절하는지 확인해.
Hint
기본 설정 위에 부분 설정을 펼쳐 반환해. 덮어쓰는 객체는 일부 키만 가져도 되지만 Settings에 없는 키는 컴파일러가 거절해야 해.

Progress

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

댓글 0

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

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