Files
vue-desktop/src/core/state/IObservable.ts
2025-08-27 11:16:56 +08:00

58 lines
1.5 KiB
TypeScript

// 订阅函数类型
export type TObservableListener<T> = (state: T) => void
// 字段订阅函数类型
export type TObservableKeyListener<T, K extends keyof T> = (values: Pick<T, K>) => void
// 工具类型:排除函数属性
export type TNonFunctionProperties<T> = {
[K in keyof T as T[K] extends Function ? never : K]: T[K]
}
// ObservableImpl 数据类型
export type TObservableState<T> = T & { [key: string]: any }
/**
* ObservableImpl 接口定义
*/
export interface IObservable<T extends TNonFunctionProperties<T>> {
/** ObservableImpl 状态对象,深层 Proxy */
readonly state: TObservableState<T>
/**
* 订阅整个状态变化
* @param fn 监听函数
* @param options immediate 是否立即触发一次
* @returns 取消订阅函数
*/
subscribe(fn: TObservableListener<T>, options?: { immediate?: boolean }): () => void
/**
* 订阅指定字段变化
* @param keys 单个或多个字段
* @param fn 字段变化回调
* @param options immediate 是否立即触发一次
* @returns 取消订阅函数
*/
subscribeKey<K extends keyof T>(
keys: K | K[],
fn: TObservableKeyListener<T, K>,
options?: { immediate?: boolean }
): () => void
/**
* 批量更新状态
* @param values Partial<T>
*/
patch(values: Partial<T>): void
/** 销毁 ObservableImpl 实例 */
dispose(): void
/**
* 语法糖:返回一个可解构赋值的 Proxy
* 用于直接赋值触发通知
*/
toRefsProxy(): { [K in keyof T]: T[K] }
}