topic
Version:
轻量级事件同步收发管理
45 lines (43 loc) • 1.5 kB
TypeScript
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 };