1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| type EventHandler<Events, K extends keyof Events> = (payload: Events[K]) => void;
type WildcardHandler<Events> = (type: keyof Events, payload: Events[keyof Events]) => void;
type Handler<Events, K extends keyof Events> = EventHandler<Events, K> | WildcardHandler<Events>;
export default function mitt<Events extends Record<string, unknown>>( all?: Map<keyof Events, Handler<Events, any>[]> ) { all = all || new Map();
return { on<K extends keyof Events>(type: K, handler: Handler<Events, K>) { const handlers = all!.get(type); if (handlers) { handlers.push(handler as any); } else { all!.set(type, [handler as any]); } },
off<K extends keyof Events>(type: K, handler?: Handler<Events, K>) { const handlers = all!.get(type); if (!handlers) return;
if (handler) { handlers.splice(handlers.indexOf(handler) >>> 0, 1); } else { all!.set(type, []); } },
emit<K extends keyof Events>(type: K, evt?: Events[K]) { (all!.get(type) || []).slice().forEach((handler: any) => { handler(evt); }); (all!.get('*') as any)?.slice().forEach((handler: any) => { handler(type, evt); }); },
get all() { return all; }, }; }
|