diff --git a/src/core/state/impl/ObservableImpl.ts b/src/core/state/impl/ObservableImpl.ts index 1728b34..c309a70 100644 --- a/src/core/state/impl/ObservableImpl.ts +++ b/src/core/state/impl/ObservableImpl.ts @@ -176,7 +176,7 @@ export class ObservableImpl> implements IObs this.notifyScheduled = false // 全量订阅 —— 每个订阅单独 try/catch,避免一个错误阻塞其它订阅 - for (const fn of Array.from(this.listeners)) { + for (const fn of this.listeners) { try { fn(this.state as unknown as T) } catch (err) { @@ -188,11 +188,11 @@ export class ObservableImpl> implements IObs } // 字段订阅:把同一个回调的多个 key 聚合到一次调用里 - const fnMap: Map, (keyof T)[]> = new Map() + const fnMap: Map, Array> = new Map() for (const key of keys) { const set = this.keyListeners.get(key) if (!set) continue - for (const fn of Array.from(set)) { + for (const fn of set) { const existing = fnMap.get(fn) if (existing === undefined) { fnMap.set(fn, [key]) @@ -212,7 +212,7 @@ export class ObservableImpl> implements IObs result[k] = (this.state as Record)[k] as T[(typeof k) & keyof T] }) // 调用时类型上兼容 TObservableKeyListener,因为我们传的是对应 key 的 Pick - fn(result as unknown as any) // 最后一处转换仅为满足 TypeScript 调用签名(不引入 any 到实现变量) + fn(result as Pick) } catch (err) { // eslint-disable-next-line no-console console.error("Observable keyListener error:", err) @@ -296,6 +296,7 @@ export class ObservableImpl> implements IObs this.keyListeners.clear() this.pendingKeys.clear() this.proxyCache = new WeakMap() + Object.freeze(this.state) } /** 语法糖:返回一个可解构赋值的 Proxy */