Typed event emitter
Event emitter를 사용할 때, event name과 handler의 타입을 미리 정의하여 typed event emitter를 만들 수 있다. 그럴려면 먼저 event emitter가 필요한데 Nodejs와 브라우저 환경에서 모두 동작하는 events
패키지를 이용해본다.
typed event emitter
type Events = {
approved: () => void
rejected: () => void
send: (message: string) => void
}
먼저 eventName이 key고 value가 handler인 형태로 타입을 작성해준다. 이벤트이름을 사전에 정의하고 이에 대응하는 핸들러의 타입도 정의해준다.
import EventEmitter from 'events'
class TypedEventEmiiter extends EventEmitter {
on<K extends keyof Event>(eventName: K, handlers: Events[K]) {
return super.on(eventName, handler)
}
emit<K extends keyof Event>(eventName: K, ...args: Parameters<Events[K]>) {
return super.emit(eventName, ...args)
}
}
기본적으로 on과 emit만 구현해보도록 한다. once, remove 등도 이와 크게 다르지 않다.