export type EventMap = Parameters; export default class EventRegistry implements Disposable { list = [] as (() => void )[]; // addEventListener(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; add(target: T, name: EventMap["0"], handler: EventMap["1"], options?) { target.addEventListener(name, handler, options); this.list.push(() => { target.removeEventListener(name, handler, options); }); } [Symbol.dispose]() { for (const element of this.list) { element(); } } }