Partial<T> 메커니즘은 TypeScript에서 객체의 속성이 일시적으로 정의되지 않을 수 있는 경우 작업을 보다 쉽게 하기 위해 도입되었습니다. 역사적으로 개발자들은 모든 속성을 선택 사항으로 만들기 위해 새로운 유형을 수동으로 생성해야 했습니다. 이는 코드 중복과 오류를 초래했습니다.
초기에는 선택적 필드가 있는 객체를 업데이트하거나 생성할 때 각 선택적 속성을 명시적으로 지정해야 했습니다. 이는 불편했고 원래 인터페이스의 변경을 지원하지 않았습니다. 그래서 모든 T 유형의 속성을 자동으로 선택 사항으로 변환하는 유틸리티 유형 Partial<T>가 등장했습니다.
API 설계 시 객체의 일부만 업데이트해야 할 때가 자주 있으며, 나머지 필드는 건드리지 않아야 합니다. 이는 특히 PATCH 요청, 업데이트 양식 및 일부 데이터만 처리하는 기능에 해당됩니다. Partial 없이 타입 지정이 복잡하고 취약해집니다.
유틸리티 타입 Partial<T>를 사용하며, 대략 다음과 같이 정의됩니다:
// 단순화: type Partial<T> = { [P in keyof T]?: T[P] };
따라서 모든 속성이 선택 사항이 됩니다. 예를 들어:
interface User { id: number; name: string; email: string; } function updateUser(id: number, user: Partial<User>) { // ... } // 수정할 내용만 전달 가능 updateUser(1, { email: "test@example.com" });
주요 특징:
Partial을 통해 원래 인터페이스의 모든 필드를 필수로 만들 수 있나요?
아니요, Partial은 모든 속성을 선택 사항으로 만듭니다. 반대 작업을 위해 Required<T> 유형이 있습니다.
이미 선택적인 속성과 함께 Partial을 사용하면 어떻게 되나요?
Partial은 이미 선택적인 속성을 변경하지 않으며, 모든 필드는 Partial 적용 이전과 동일하게 선택 사항으로 남아 있습니다.
예:
interface X { x?: number; y: string; } const a: Partial<X> = {}; // 두 속성이 이제 모두 선택 사항
Partial을 사용하여 중첩 구조를 사용하는 경우 중첩된 필드만 선택 사항으로 만들 수 있나요?
Partial은 중첩된 객체에 재귀적으로 전파되지 않습니다. 모든 중첩 속성을 선택 사항으로 만들려면 사용자 지정 제네릭 타입을 작성하거나 외부 유틸리티를 사용해야 합니다.
CRUD 시스템에서 updateUser는 Partial<User>를 받아들이며 빈 객체를 전달할 수 있어 런타임에서 필수 필드가 사라지는 오류를 초래할 수 있습니다.
장점:
단점:
Partial<User>는 업데이트 입력 양식을 설명하는 데만 사용됩니다. 최종 단계에서 모든 필드는 유효성을 검사하고 원래 객체와 병합되어 데이터베이스에 전달됩니다.
장점:
단점: