编辑代码

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 });