강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

5647kr님의 프로필 이미지
5647kr

작성한 질문수

핵심만 골라 배우는 TypeScript

Exclude<T>

Exclude 이해

작성

·

18

·

수정됨

0

type T5 = {
  name: string;
  age: number;
};

type U5 = {
  name: string;
  age: number;
  gender: boolean;
};

type NewType5_1 = Exclude<T5, U5>;

NewType5_1에 T5가 반환되는게 이해가 안되서요 혹시 제가 이해하고 있는게 맞는지 확인부탁드립니다.

단일객체를 기준으로 속성값이 모두 일치하지 않으면 첫번째 타입을 반환한다.

즉, T5에는 U5에 있는 gender속성이 없기 때문에 다르다 판단하여 T5를 그대로 반환한다.

그리고 만일 단일 객체중 원하는 속성만을 반환해 새로운 타입을 생성하고 싶을 경우엔 pick이나 omit을 사용한다.로 이해하면 될까요?

맞게 이해한건지 모르겠네요

답변 2

0

수코딩님의 프로필 이미지
수코딩
지식공유자

안녕하세요!
Exclude<T, U>는 객체의 속성을 비교하여 차이를 계산하는 타입이 아니라, 조건부 타입을 기반으로 T가 U에 할당 가능한지 여부를 판단하여 타입을 제거하거나 유지하는 역할을 합니다. 내부적으로 Exclude<T, U>는 T extends U ? never : T 형태로 동작합니다.

질문에 제시된 코드에서 T5는 name과 age 속성만을 가지고 있으며, U5는 여기에 더해 gender라는 필수 속성을 요구합니다. 따라서 T5는 U5에 할당될 수 없고, 이로 인해 T5 extends U5 조건은 성립하지 않습니다. 그 결과 Exclude<T5, U5>의 결과 타입은 never가 아닌 T5가 됩니다.

이 상황을 “두 객체의 속성이 모두 일치하지 않기 때문에 첫 번째 타입이 반환된다”라고 이해하는 것은 결과적으로는 맞을 수 있으나, 정확한 개념은 속성의 일치 여부를 비교하는 것이 아니라 할당 가능성(extends 관계)을 기준으로 판단한다는 점입니다.

또한 Exclude는 주로 유니언 타입에서 특정 타입을 제거하기 위한 용도로 사용되며, 단일 객체 타입에 적용할 경우에는 실질적인 활용도가 크지 않습니다. 객체 타입에서 원하는 속성만 선택하거나 특정 속성을 제외하여 새로운 타입을 생성하고자 할 때에는 Pick이나 Omit을 사용하는 것이 적절합니다.

따라서 질문에서 정리하신 것처럼, 객체 타입의 일부 속성만을 기준으로 새로운 타입을 만들고 싶을 경우에는 Pick이나 Omit을 사용한다고 이해하시면 올바른 방향입니다.

0

안녕하세요, 인프런 AI 인턴입니다. 5647kr님.

Exclude 유틸리티 타입은 TypeScript에서 일반적인 타입에서 특정한 부분을 제거할 때 사용합니다. Exclude<A, B> 구문은 타입 A에서 타입 B에 assignable한 부분을 제거하는 역할을 합니다.

하지만, Exclude는 객체의 속성을 기준으로 작동하지 않습니다. 단순히 유니언 타입의 요소 제거에 사용됩니다. 즉, Exclude<T5, U5>는 실제로는 작동하지 않는 예제가 됩니다. T5U5가 객체 타입이기 때문에 유의미한 차이가 없어 정상적인 결과를 기대하기 어렵습니다.

type T5 = {
  name: string;
  age: number;
};

type NewType5_1 = Exclude<T5, "name">;
// NewType5_1은 T5와 동일한 상태입니다. 

Exclude는 위와 같이 문자 리터럴 유니언 타입과 같이 특정 값의 집합에서 제거할 때 더 유용합니다.

기존 코드를 Pick 혹은 Omit 으로 바꾼다면, 특정 속성을 선택하거나 제외하여 새로운 타입을 만들어 낼 수 있습니다. Pick<T, K> 는 타입 T에서 key K를 선택해 주고, Omit<T, K>T에서 key K들을 제외해 줍니다.

따라서 설명하신 의도대로라면 Pick이나 Omit을 검토해보시는 것이 적합할 것입니다.

관련 예시 제공해 드리니 참고해 주세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

5647kr님의 프로필 이미지
5647kr

작성한 질문수

질문하기