Partial, Pick, Omit, Record 같은 Utility Type은 언제 사용하나요?
답변 포인트
기존 타입을 변형해 재사용하는 방식를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
Utility Type은 기존 타입을 재사용해 선택적 속성, 일부 속성 선택, 특정 속성 제외, 키-값 맵 타입을 만들 때 사용합니다. 중복 선언을 줄이고 원본 타입 변경에 강해집니다.
Utility Type은 기존 타입을 재사용해 선택적 속성, 일부 속성 선택, 특정 속성 제외, 키-값 맵 타입을 만들 때 사용합니다. 중복 선언을 줄이고 원본 타입 변경에 강해집니다.
핵심 개념
핵심 기준은 기존 타입을 변형해 재사용하는 방식입니다. 이 개념은 단순한 용어가 아니라, 실제 코드나 시스템에서 반복적으로 생기는 문제를 다루기 위해 등장했습니다.
TypeScript는 런타임 전에 실수를 발견하고 코드의 의도를 타입으로 문서화하기 위해 사용합니다. 좋은 타입은 자동완성, 리팩터링, 협업 안정성을 높여줍니다.
동작 흐름
- 먼저 어떤 문제가 있는지 확인합니다.
- 이 개념이 그 문제를 어떤 기준으로 나누거나 해결하는지 봅니다.
- 실제 코드에서는 입력, 상태, 실행 순서, 비용이 어떻게 바뀌는지 확인합니다.
- 마지막으로 한계와 부작용을 함께 점검합니다.
실제 예시
type User = {
id: string;
name: string;
email: string;
};
type UserPatch = Partial<Pick<User, "name" | "email">>;
type UserMap = Record<string, User>;기존 타입을 조합해 파생 타입을 만들면 중복 선언을 줄이고 모델 변경에 강해집니다.
실무에서 주의할 점
- 타입 단언으로 오류를 덮기보다 타입을 좁히는 코드를 먼저 고려합니다.
- 런타임 검증이 필요한 외부 입력은 타입만으로 안전해지지 않습니다.
- 공개 타입은 너무 구체적이어도, 너무 느슨해도 유지보수가 어려워집니다.
함께 연결해서 보면 좋은 키워드
TS, UtilityType, Partial, Omit
정리
한 줄로 정리하면, Utility Type은 기존 타입을 재사용해 선택적 속성, 일부 속성 선택, 특정 속성 제외, 키-값 맵 타입을 만들 때 사용합니다. 중복 선언을 줄이고 원본 타입 변경에 강해집니다. 실무에서는 개념을 적용하는 조건과 적용하지 않았을 때 생기는 문제까지 함께 이해하는 것이 중요합니다.
Utility Type의 실무 활용
TypeScript의 Utility Type은 기존 타입을 변형해 반복 선언을 줄여줍니다.
interface User {
id: string;
name: string;
email: string;
role: 'admin' | 'user';
}
type UpdateUserInput = Partial<Pick<User, 'name' | 'email'>>;
type PublicUser = Omit<User, 'email'>;
type UserMap = Record<string, User>;주요 타입
| 타입 | 의미 | 예시 |
|---|---|---|
Partial<T> | 모든 속성을 optional | PATCH 입력 |
Required<T> | 모든 속성을 required | 정규화된 설정 |
Pick<T, K> | 일부 속성 선택 | DTO 생성 |
Omit<T, K> | 일부 속성 제외 | 민감 정보 제거 |
Record<K, V> | key-value 객체 | lookup table |
주의사항
Utility Type은 편하지만 도메인 의미가 사라질 수 있습니다. type SignupInput = Pick<User, ...>가 실제 가입 규칙을 충분히 표현하지 못한다면 별도 타입을 만드는 편이 낫습니다.