Skip to content

Exclude<UnionType, ExcludedMembers>

INFO

Exclude\<UnionType, ExcludedMembers>은 TypeScript 2.8 이상에서 사용할 수 있는 내장 유틸리티 타입이에요. 자세한 내용은 타입스크립트 핸드북릴리즈 노트를 참고해주세요.

개요

Exclude<UnionType, ExcludedMembers>는 TypeScript에 내장된 유틸리티 타입으로, UnionType에서 ExcludedMembers에 할당 가능한 모든 유니온 멤버를 제외하여 타입을 구성해요.

문법

ts
type Exclude<T, U> = T extends U ? never : T;
  • UnionType (T): 이 타입은 특정 멤버를 제외하려는 유니온 타입을 나타내요. 여러 가능한 값이나 타입을 포함할 수 있어요.
  • ExcludedMembers (U): 이 타입은 유니온 타입에서 제외하고자 하는 멤버 또는 타입을 나타내요. 유니온 타입에서 어떤 멤버를 제거할지를 지정하는 타입이에요.

예제

예제 #1

ts
type Fruit = Exclude<'apple' | 'banana' | 'orange' | 'pizza' | 'chicken', 'pizza' | 'chicken'>;
// type Fruit = "apple" | "banana" | "orange";

예제 #2

ts
type Shape =
  | { kind: 'circle'; radius: number }
  | { kind: 'square'; x: number }
  | { kind: 'triangle'; x: number; y: number };

type NonCircleShape = Exclude<Shape, { kind: 'circle' }>;
// type NonCircleShape = { kind: 'square'; x: number } | { kind: 'triangle'; x: number; y: number };

예제 #3

ts
type Circle = {
  radius: number;
};

type Square = {
  side: number;
};

function notUsingExclude(type: Circle | Square) {
  // Circle 또는 Square 속성을 가진 모든 객체를 수용해요.
  // 유니온 타입은 속성의 조합을 허용하므로 여기서는 타입 오류가 발생하지 않아요.
}

notUsingExclude({ radius: 5, side: 5 }); // ✅

type PickOne<T> = {
  [K in keyof T]: Record<K, T[K]> & Partial<Record<Exclude<keyof T, K>, undefined>>;
}[keyof T];

function usingExclude(type: PickOne<Circle & Square>) {
  // Circle과 Square에서 정확히 하나의 속성을 가진 객체를 수용해요.
  // PickOne을 사용하면 하나의 속성만 정의할 수 있고 다른 속성은 `undefined` 혹은 생략되어야 해요.
}

usingExclude({ radius: 5 }); // ✅
usingExclude({ radius: 5, side: undefined }); // ✅
usingExclude({ side: 5 }); // ✅
usingExclude({ radius: undefined, side: 5 }); // ✅
usingExclude({ radius: 5, side: 5 }); // ❌