Adds types to the EventTarget class.
Hopefully this won't be necessary forever:
In addition to types, a safeDispatchEvent method is available which prevents dispatching events that aren't in the event map, and a listenerCount method which reports the number of listeners that are currently registered for a given event.
safeDispatchEvent
listenerCount
import { TypedEventEmitter } from 'main-event'import type { TypedEventTarget } from 'main-event'interface EventTypes { 'test': CustomEvent<string>}const target = new TypedEventEmitter<EventTypes>()// it's a regular EventTargetconsole.info(target instanceof EventTarget) // true// register listeners normallytarget.addEventListener('test', (evt) => { // evt is CustomEvent<string>})// @ts-expect-error 'derp' is not in the event maptarget.addEventListener('derp', () => {})// use normal dispatchEvent methodtarget.dispatchEvent(new CustomEvent('test', { detail: 'hello'}))// use type safe dispatch methodtarget.safeDispatchEvent('test', { detail: 'world'})// report listener countconsole.info(target.listenerCount('test')) // 0// event emitters can be used purely as interfaces toofunction acceptTarget (target: TypedEventTarget<EventTypes>) { // ...} Copy
import { TypedEventEmitter } from 'main-event'import type { TypedEventTarget } from 'main-event'interface EventTypes { 'test': CustomEvent<string>}const target = new TypedEventEmitter<EventTypes>()// it's a regular EventTargetconsole.info(target instanceof EventTarget) // true// register listeners normallytarget.addEventListener('test', (evt) => { // evt is CustomEvent<string>})// @ts-expect-error 'derp' is not in the event maptarget.addEventListener('derp', () => {})// use normal dispatchEvent methodtarget.dispatchEvent(new CustomEvent('test', { detail: 'hello'}))// use type safe dispatch methodtarget.safeDispatchEvent('test', { detail: 'world'})// report listener countconsole.info(target.listenerCount('test')) // 0// event emitters can be used purely as interfaces toofunction acceptTarget (target: TypedEventTarget<EventTypes>) { // ...}
Adds types to the EventTarget class.
Hopefully this won't be necessary forever:
In addition to types, a
safeDispatchEventmethod is available which prevents dispatching events that aren't in the event map, and alistenerCountmethod which reports the number of listeners that are currently registered for a given event.Example