이 연습에서는 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>