Обычно в Node.js и традиционном JavaScript у вас есть один эмиттер событий. Этот эмиттер событий внутри отслеживает слушателя для разных типов событий, например:
exportinterfaceListener<T>{(event:T):any;}exportinterfaceDisposable{dispose();}/** проходит через события по мере их возникновения. Вы не будете получать * события до того, как начнете слушать */exportclassTypedEvent<T>{privatelisteners:Listener<T>[]=[];privatelistenersOncer:Listener<T>[]=[];on=(listener:Listener<T>):Disposable=>{this.listeners.push(listener);return{dispose:()=>this.off(listener),};};once=(listener:Listener<T>):void=>{this.listenersOncer.push(listener);};off=(listener:Listener<T>)=>{varcallbackIndex=this.listeners.indexOf(listener);if(callbackIndex>-1)this.listeners.splice(callbackIndex,1);};emit=(event:T)=>{/** Обновить слушателей */this.listeners.forEach((listener)=>listener(event));/** Очистить очередь единожды */if(this.listenersOncer.length>0){consttoCall=this.listenersOncer;this.listenersOncer=[];toCall.forEach((listener)=>listener(event));}};pipe=(te:TypedEvent<T>):Disposable=>{returnthis.on((e)=>te.emit(e));};}