타입스크립트 유틸리티 타입, 코드 중복과 타입 오류를 한 방에!

by DD
2주 전
조회수 26

타입스크립트(TypeScript)는 코드 중복과 타입 불일치 문제를 해결하기 위해 유틸리티 타입(Utility Types)을 제공함

Partial, Required, Pick, Omit, Record 등 5가지 유틸리티 타입을 활용하여 원본 타입을 변환하여 코드 중복 감소(Code Duplication Reduction)

유틸리티 타입 조합을 통해 복잡한 타입 변환을 선언적으로 표현 가능하며, 가독성(Readability) 확보를 위해 중간 타입 분리 권장

실무에서 API 요청/응답 타입, 폼 입력 타입 등 기존 모델에서 파생되는 타입에 유틸리티 타입 적용을 권장

Partial: 선택적 프로퍼티 변환

Partial은 타입 T의 모든 프로퍼티를 선택적(optional)으로 변경하는 유틸리티 타입이다. 수정 기능 구현 시(Implementation of Update Functionality), 변경할 필드만 전달받아 원본 객체에 병합하는 데 활용된다.

장점: 불필요한 필드를 일일이 명시할 필요 없이, 변경 대상 필드만 선택적으로 지정(Selective Field Specification) 가능

주의사항: 모든 필드가 선택적이므로, 빈 객체({})도 유효한 값으로 간주될 수 있어 런타임 검증(Runtime Validation) 필요

활용 사례: API 호출 시, 변경할 필드만 담아 요청하는 경우, Partial을 사용하여 타입 안전성(Type Safety)을 유지하면서 코드 간결성을 확보한다.

Required: 필수 프로퍼티 강제

Required는 타입 T의 모든 선택적 프로퍼티에서 ?를 제거하여, 모든 필드가 반드시 존재하도록 강제하는 유틸리티 타입이다. 설정 객체처럼 기본값 병합 후 모든 필드가 채워져야 하는 상황(Situation where all fields must be filled after merging default values)에서 유용하다.

활용: 입력 시점에는 선택적이지만, 가공을 거친 이후에는 모든 값이 확정되어야 하는 흐름을 타입으로 표현

장점: 선택성(Optionality)으로 인한 불확실성을 제거하여, 내부 구현 코드의 단순화(Simplification)를 유도

패턴: 입력은 느슨하게 받고, 내부에서는 엄격하게 다루는 타입스크립트의 일반적인 원칙(General Principle of TypeScript)을 따름

Pick: 특정 필드 선택

Pick은 기존 타입에서 특정 필드만 골라 새 타입을 만드는 유틸리티 타입이다. 컴포넌트 props처럼, 전체 데이터 중 일부만 필요로 하는 인터페이스를 명확하게 표현할 때 유용하다.

장점: 타입 이름만 봐도 어떤 필드가 포함되는지 바로 알 수 있어, 선언적(Declarative) 코드 작성 가능

단점: 원본 타입에서 대부분의 필드를 남기고 일부만 제외하고 싶을 때는, 남길 필드를 일일이 나열해야 해서 장황해지는 단점(Verbosity) 존재

활용 사례: API 응답에서 필요한 필드만 선택하거나, 컴포넌트 props를 정의할 때 타입 안전성(Type Safety)을 유지하면서 코드 가독성을 높인다.

Omit: 특정 필드 제외

Omit은 원본 타입 T에서 K에 해당하는 프로퍼티만 빼고 나머지 전부로 새 타입을 만드는 유틸리티 타입이다. 빼야 할 필드가 적고 남길 필드가 많을 때, Pick 보다 훨씬 간결하다.

장점: 제외할 필드만 지정(Specify only the fields to exclude)하면 되므로, 원본 타입에 필드가 추가되어도 새 타입에 자동으로 반영

활용: 게시글 생성 API 요청 타입, 비밀번호와 같은 민감 정보 응답에서 제외할 때 사용

주의사항: 도메인 모델에서 요청/응답 타입을 곧바로 파생시키는 방식은 편리하지만, 두 타입이 서로 다른 방향으로 진화할 수 있으므로 독립된 타입으로 분리(Separate into independent types)하는 것을 고려

Record: 키-값 타입 강제

Record는 키 집합과 값 타입으로 구성된 객체 타입을 만들어주는 유틸리티 타입이다. 정해진 키 집합에 대해 모든 값을 매핑해야 하는 상황에서 유용하다.

특징: 인덱스 시그니처({ [key: string]: string })와 비슷하지만, Record는 키를 리터럴 유니온으로 제한하여 허용되는 키 집합을 명확하게 고정(Clearly fix the allowed key set)

장점: 지정한 키가 누락되면 컴파일 에러가 발생하고, 허용되지 않은 키를 추가하려 해도 에러가 발생하여 타입 안전성(Type Safety) 강화

활용 사례: 페이지 권한, 상태별 스타일, 언어별 문자열 등, 정해진 키 집합에 대해 모든 값을 매핑해야 하는 상황

타입스크립트 타입, 꼭 새로 만들어야 할까?