type EventName = string & { __eventName: never };
type TEvent<T = any, U = any> = {
name: EventName;
resolver: {
params: (param: T) => void;
extra: (param: U) => void;
};
};
const createEvent = function <T = any, U = any>(
event: TEvent<T, U>,
): TEvent<T, U> {
return event;
};
const eventManager = () => {
const store = new Map<EventName, TEvent<any, any>>();
return {
add: (event: TEvent<any, any>) => {
store.set(event.name, event);
},
get: (name: EventName) => {
return store.get(name);
},
};
};
type TArgs = {
a: string;
b: number;
};
type TExtra = {
c: number;
};
const testobj = createEvent<TArgs, TExtra>({
name: 'test' as EventName,
resolver: {
params: (param: TArgs) => {
console.log(param.a, param.b);
},
extra: (param: TExtra) => {
console.log(param);
},
},
});
const events = eventManager();
events.add(testobj);
const emit = <T extends TEvent<any, any>>(name: T['name'], params: Parameters<T['resolver']['params']>[0], extras?: Parameters<T['resolver']['extra']>[0]) => {
const event = events.get(name);
event?.resolver.params(params);
event?.resolver.extra(extras);
};
emit('test1' as EventName, { a: '1', b: '111' }, { c: 122 });