유틸리티 타입은 기존 타입을 기반으로 타입을 변환, 수정 또는 파생하는 TypeScript의 내장 도구입니다. 가장 일반적으로 사용되는 것들은:
Partial<T> — 타입 T의 모든 속성을 선택 사항으로 만듭니다.Required<T> — 모든 속성을 필수로 만듭니다.Pick<T, K> — 타입 T에서 속성 K만 선택합니다.Omit<T, K> — 타입 T에서 속성 K를 제외합니다.type User = { id: number; name: string; age?: number }; type UserPreview = Pick<User, 'id' | 'name'>; type UserPatch = Partial<User>; type FullUser = Required<User>; type UserWithoutAge = Omit<User, 'age'>;
이것은 더 유연한 API 및 DTO를 만드는 데 도움이 됩니다.
타입의 속성이 선택적(
age?: number)으로 지정된 경우, Required<T>는 어떻게 작동하나요? 여전히 선택적일까요?
답변: 아닙니다, Required<T>는 타입 T의 모든 속성을 필수(필수)로 변환합니다.
type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }
이야기
Partial<T>를 사용하여 객체를 업데이트했지만, 데이터베이스에 안전하다고 자동으로 간주하는 실수를 범했습니다. null/undefined에 대한 검사를 잊어버려 변경 시 유효성 검사 오류가 발생했습니다.
이야기
Omit<T, K>를 사용하여 요청 타입에서 기술 속성을 제외했지만, 모델을 리팩토링할 때 새로운 기술 필드가 제외 목록에 추가되지 않았습니다. 결국, 개인 필드가 API를 통해 유출되었습니다.
이야기
공유 라이브러리에서 Pick<T, K> 타입을 생성했는데, 키 목록에 오류가 있었습니다: K가 원래 타입에 부분적으로 отсутствовало. TypeScript는 리터럴 문자열을 사용할 때 오류를 무시했지만, 원래 타입이 변경되면서 불일치가 발생했고, 일부 타입이 모든 서비스에서 "깨졌습니다."