Ts发布订阅模式
- 简单类型
interface IOnEmitter<T>{
eventName:string;
fn:(aegs?:T)=>void
}
interface IEmitterParams<T>{
eventName?:string;
params?:T
}
class Emitter<T>{
emitterList:IOnEmitter<T>[];
constructor(){
this.emitterList=[]
}
on(onEmitter:IOnEmitter<T>){
//去重
this.emitterList.push(onEmitter)
}
emit(emit:IEmitterParams<T>){
this.emitterList.forEach((item)=>{
if(item.eventName===emit.eventName){
item.fn(emit.params)
}
})
}
}
type IParamsOftheEmitter=Record<string,any>
const theEmitter=new Emitter<IParamsOftheEmitter>()
theEmitter.on({eventName:'BARK',fn:()=>{
console.log('bark')
}})
theEmitter.on({eventName:'HI',fn:()=>{
console.log('hi')
}})
theEmitter.on({eventName:'OK',fn:(aegs?:IParamsOftheEmitter)=>{
console.log('ok',aegs)
}})
theEmitter.emit({eventName:'BARK'})
theEmitter.emit({eventName:'OK',params:{name:'jack'}})
type IParamsOftheEmitter2=string
const theEmitter2=new Emitter<IParamsOftheEmitter2>()
theEmitter2.on({eventName:'WHY',fn:(aegs?:IParamsOftheEmitter2)=>{
console.log('why',aegs)
}})
theEmitter2.emit({eventName:'WHY',params:'not'})