58 lines
1.5 KiB
TypeScript
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] }
|
|
}
|