diff --git a/src/api/become-observed.ts b/src/api/become-observed.ts index c9de42206..c7feca52a 100644 --- a/src/api/become-observed.ts +++ b/src/api/become-observed.ts @@ -38,12 +38,14 @@ function interceptHook(hook: "onBecomeObserved" | "onBecomeUnobserved", thing, a const atom: IObservable = typeof arg2 === "string" ? getAtom(thing, arg2) : (getAtom(thing) as any) const cb = typeof arg2 === "string" ? arg3 : arg2 - const listenersKey = `${hook}Listeners` + const listenersKey = `${hook}Listeners` as + | "onBecomeObservedListeners" + | "onBecomeUnobservedListeners" - if (!atom[listenersKey]) { - atom[listenersKey] = new Set([cb]) + if (atom[listenersKey]) { + atom[listenersKey]!.add(cb) } else { - ;(atom[listenersKey] as Set).add(cb) + atom[listenersKey] = new Set([cb]) } const orig = atom[hook] @@ -51,7 +53,7 @@ function interceptHook(hook: "onBecomeObserved" | "onBecomeUnobserved", thing, a return fail(process.env.NODE_ENV !== "production" && "Not an atom that can be (un)observed") return function() { - const hookListeners = atom[listenersKey] as Set | undefined + const hookListeners = atom[listenersKey] if (hookListeners) { hookListeners.delete(cb) if (hookListeners.size === 0) { diff --git a/src/core/observable.ts b/src/core/observable.ts index 4c4a9d414..a73d39afe 100644 --- a/src/core/observable.ts +++ b/src/core/observable.ts @@ -1,4 +1,5 @@ import { + Lambda, ComputedValue, IDependencyTree, IDerivation, @@ -31,6 +32,9 @@ export interface IObservable extends IDepTreeNode { onBecomeUnobserved(): void onBecomeObserved(): void + + onBecomeUnobservedListeners: Set | undefined + onBecomeObservedListeners: Set | undefined } export function hasObservers(observable: IObservable): boolean {