BaseStore
code:base_store.ts
export type BaseStoreListenerInit<Event, Derived extends BaseStore<Event>> = {
store: Derived;
event: Event;
};
export type BaseStoreListener<Event, Derived extends BaseStore<Event>> = (
init: BaseStoreListenerInit<Event, Derived>,
) => void;
export class BaseStore<Event = string> {
constructor() {}
addChangeListener(listener: BaseStoreListener<Event, this>): void {
if (this._onChangeListeners.includes(listener)) {
throw new Error("already registerd");
}
this._onChangeListeners.push(listener);
}
removeChangeListener(listener: BaseStoreListener<Event, this>): void {
this._onChangeListeners = this._onChangeListeners.filter((l) => l !== listener);
}
emitChange(event: Event): void {
for (const listener of this._onChangeListeners) {
listener({ store: this, event });
}
}
get listenersCount(): number {
return this._onChangeListeners.length;
}
private _onChangeListeners: BaseStoreListener<Event, this>[] = [];
}