UNPKG

topic

Version:

轻量级事件同步收发管理

45 lines (43 loc) 1.5 kB
interface SubscribeToken { unsubscribe: () => void; } interface KeepToken { release: () => void; } interface CommonObject { [key: string]: any[]; } interface Callback<T extends CommonObject, K extends keyof T> { (...args: T[K]): void; } declare type Listener<T extends CommonObject> = Partial<Record<keyof T, { token: string; fn: Callback<T, any>; }[]>>; interface Keep<T extends CommonObject> { shouldPublish: true | (() => boolean); name: keyof T; token: string; args: any[]; } declare class Topic<T extends CommonObject> { protected listeners: Listener<T>; protected origins: Listener<T>; protected keeps: Keep<T>[]; publish<K extends keyof T>(name: K, ...args: T[K]): void; subscribeOnce<K extends keyof T>(name: K, fn: Callback<T, K>): SubscribeToken; subscribe<K extends keyof T>(name: K, fn: Callback<T, K>): SubscribeToken; /** * Keep publishing for every subscription. * The deps can be `true` or a function `() => true/false`. For dynamic publishing, function is required. * ```javascript * let deps = true; * topic.keep('test', () => deps, 'hello', 'world'); * ``` */ keep<K extends keyof T>(name: K, shouldPublish: Keep<T>['shouldPublish'], ...args: T[K]): KeepToken; protected unsubscribe(name: keyof T, token: string): void; protected release(token: string): void; } declare const topic: Topic<CommonObject>; export { CommonObject, KeepToken, SubscribeToken, Topic, topic };