이 연습에서는 Event 타입에서 type"keydown" 이 아닌 모든 이벤트를 추출하는 작업을 수행해야 합니다.

export type Event =
  | {
      type: "click"
      event: MouseEvent
    }
  | {
      type: "focus"
      event: FocusEvent
    }
  | {
      type: "keydown"
      event: KeyboardEvent
    }

type NonKeyDownEvents = unknown

이렇게 하려면 앞서 살펴본 Extract 유틸리티 타입과 반대인 유틸리티 타입을 사용해야 합니다.

나의 답

import { Equal, Expect } from '../helpers/type-utils';

export type Event =
  | {
      type: 'click';
      event: MouseEvent;
    }
  | {
      type: 'focus';
      event: FocusEvent;
    }
  | {
      type: 'keydown';
      event: KeyboardEvent;
    };

type NonKeyDownEvents = Exclude<Event, { type: 'keydown' }>;

type tests = [
  Expect<
    Equal<
      NonKeyDownEvents,
      | { type: 'click'; event: MouseEvent }
      | { type: 'focus'; event: FocusEvent }
    >
  >
];

유틸리티 타입을 사용하여 유니온의 단일 멤버 제거하기

여기서 해결책은 Exclude 유틸리티 타입을 사용하는 것입니다.

type NonKeyDownEvents = Exclude<Event, { type: "keydown" }>

<aside> 💡 이렇게 객체 형태를 넘겨서 Exclude 할 수 있구나!

</aside>

Exclude 유틸리티 타입은 Extract 와 유사하게 작동하지만 이번에는 keydown 타입을 유니온에서 제외합니다.

유니온의 멤버가 여러 개 있는데 한 가지만 제거하려는 경우 Exclude 가 유용합니다.

<aside> 💡 두번째 파라미터를 유니온으로 전달하면 여러개를 제외할 수도 있는데 왜 한 가지만 이라고 설명하는 걸까?

</aside>