优化ObservableImpl

This commit is contained in:
2025-09-17 10:10:25 +08:00
parent 6eee4933e1
commit 3a6f5cdbba

View File

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