프로그래밍풀스택 개발자

TypeScript에서 '유틸리티 타입'(예: Partial, Required, Pick, Omit) 이란 무엇이며, 어디서 어떻게 사용해야 하는지, 그리고 사용 시 자주 발생하는 오류는 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

유틸리티 타입은 기존 타입을 기반으로 타입을 변환, 수정 또는 파생하는 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는 리터럴 문자열을 사용할 때 오류를 무시했지만, 원래 타입이 변경되면서 불일치가 발생했고, 일부 타입이 모든 서비스에서 "깨졌습니다."