Store.ts

// Store.ts - 单例状态容器核心类

export type StoreSubscriber<T = any> = (
  data: T,
  prevData: T | undefined
) => void

/**
 * 单例状态容器
 * 简单的全局状态管理,支持订阅状态变化
 */
export class Store<T extends Record<string, any> = Record<string, any>> {
  private state: Partial<T> = {}
  private subscribers = new Map<keyof T, Set<StoreSubscriber>>()

  /**
   * 设置状态
   */
  setState<K extends keyof T>(key: K, value: T[K]): void {
    const prevValue = this.state[key]
    this.state[key] = value
    this.notifySubscribers(key, value, prevValue)
  }

  /**
   * 获取状态
   */
  getState<K extends keyof T>(key: K): T[K] | undefined {
    return this.state[key]
  }

  /**
   * 删除状态
   */
  deleteState<K extends keyof T>(key: K): void {
    const prevValue = this.state[key]
    delete this.state[key]
    this.notifySubscribers(key, undefined as any, prevValue)
  }

  /**
   * 订阅状态变化
   */
  subscribe<K extends keyof T>(
    key: K,
    subscriber: StoreSubscriber<T[K]>
  ): () => void {
    if (!this.subscribers.has(key)) {
      this.subscribers.set(key, new Set())
    }
    this.subscribers.get(key)!.add(subscriber)

    // 如果已有状态,立即通知
    const currentValue = this.state[key]
    if (currentValue !== undefined) {
      subscriber(currentValue, undefined)
    }

    // 返回取消订阅函数
    return () => this.unsubscribe(key, subscriber)
  }

  /**
   * 取消订阅
   */
  unsubscribe<K extends keyof T>(
    key: K,
    subscriber: StoreSubscriber<T[K]>
  ): void {
    this.subscribers.get(key)?.delete(subscriber)
  }

  /**
   * 通知订阅者
   */
  private notifySubscribers<K extends keyof T>(
    key: K,
    value: T[K],
    prevValue: T[K] | undefined
  ): void {
    this.subscribers
      .get(key)
      ?.forEach((subscriber) => subscriber(value, prevValue))
  }

  /**
   * 获取所有状态
   */
  getSnapshot(): Partial<T> {
    return { ...this.state }
  }

  /**
   * 重置所有状态
   */
  reset(): void {
    const keys = Object.keys(this.state) as (keyof T)[]
    keys.forEach((key) => this.deleteState(key))
  }

  /**
   * 批量更新状态
   */
  batchUpdate(updates: Partial<T>): void {
    Object.entries(updates).forEach(([key, value]) => {
      this.setState(key as keyof T, value as T[keyof T])
    })
  }
}

/**
 * 创建类型安全的 Store
 */
export function createStore<T extends Record<string, any>>(): Store<T> {
  return new Store<T>()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
上次更新:
(adsbygoogle = window.adsbygoogle || []).push({});