@morjs/runtime-base
Version:
mor runtime base
63 lines (62 loc) • 2.91 kB
TypeScript
export declare type EventType = string | symbol;
export declare type EventHandler<T = unknown> = (event: T) => void;
export declare type WildcardEventHandler<T = Record<string, unknown>> = (type: keyof T, event: T[keyof T]) => void;
export declare type EventHandlerList<T = unknown> = Array<EventHandler<T>>;
export declare type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardEventHandler<T>>;
export declare type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<keyof Events | '*', EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>>;
export interface Emitter<Events extends Record<EventType, unknown>> {
/**
* 用于存储事件名称和处理方法的 Map 对象
*/
all: EventHandlerMap<Events>;
/**
* 注册事件及监听函数
* @param type - 事件类型, * 可添加通配符监听函数
* @param handler - 事件监听函数
*/
on<Key extends keyof Events>(type: Key, handler: EventHandler<Events[Key]>): void;
on(type: '*', handler: WildcardEventHandler<Events>): void;
/**
* 移除特定类型的事件监听
* 如果未指定 handler, 则该类型的事件将会被全部移除
* @param type - 需要移除监听函数的类型 from (`'*'` 可用于移除通配符监听函数)
* @param handler - 需要移除的特定监听函数
*/
off<Key extends keyof Events>(type: Key, handler?: EventHandler<Events[Key]>): void;
off(type: '*', handler: WildcardEventHandler<Events>): void;
/**
* 触发特定类型的时间
* `'*'` 通配符监听函数执行时间晚于普通事件类型
* 注意: 不支持手动触发 '*' 事件
*
* @param type - 事件类型
* @param evt - 传递给事件监听函数的值, 可以是任意类型
*/
emit<Key extends keyof Events>(type: Key, event: Events[Key]): void;
emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;
/**
* 注册一次性事件及监听函数(仅执行一次)
* @param type - 事件类型, * 可添加通配符监听函数
* @param handler - 事件监听函数
*/
once<Key extends keyof Events>(type: Key, handler: EventHandler<Events[Key]>): void;
once(type: '*', handler: WildcardEventHandler<Events>): void;
}
/**
* 创建 Emitter 实例
* @param reason - 事件创建原因, 用于统计
* @param all - 自定义 Map 用于存储事件名称和事件处理函数
* @returns Emitter
*/
export declare function createEvent<Events extends Record<EventType, unknown>>(reason: string, all?: EventHandlerMap<Events>): Emitter<Events>;
/**
* 获取所有 event 实例
*/
export declare function getAllEvents(): Record<string, {
createdAt: number;
event: Emitter<any>;
}[]>;
/**
* 全局默认 Event
*/
export declare const event: Emitter<Record<EventType, unknown>>;