import type { AnyObj } from '../util'; import { type Watcher } from './watch'; export declare const VM_PARENTS: unique symbol; export declare const VM_WATCHERS: unique symbol; export declare const VM_RAW: unique symbol; export declare const VM_IGNORED: unique symbol; export declare const GlobalViewModelWeakMap: WeakMap>; export type ViewModelParents = Map>; export type ViewModel = { [VM_PARENTS]?: ViewModelParents; [VM_WATCHERS]?: Set; /** * 指向当前 ViewModel 所属的原始数据。vm() 函数包裹后返回的是 ViewModel 的 Proxy,不论是 ViewModel 还是它的 Proxy 都和原始数据是完全独立的两套。 * 并且原始数据会挂在 [VM_RAW] 属性上,通过 vmRaw() 函数可以直接拿到这个属性,快速且高效地获取完整的原始数据。 * * 为了保证数据的一致性,任何在 ViewModel 上的操作,都会同时在其原始数据上也操作。比如: * ```ts * const a = { a: 10 }; const b = { b: 10 }; * const va = vm(a); * va.b = b; * console.log(a) // a 这个原始数据上,也会有 b 的原始数据,即: { a: 10, b: { 10 }} * console.log(toRaw(va) === a) // true * ``` */ [VM_RAW]: T; } & T; export type ViewModelIgnore = T & { [VM_IGNORED]: boolean; }; export type ViewModelArray = ViewModel & ViewModel[]; export type PropertyPathItem = string | number | symbol; export declare function isInnerObj(v: unknown): v is T; export declare function isViewModel(v: unknown): v is ViewModel; export declare function shouldBeVm(v: unknown): v is ViewModel; export declare function addParent(child: ViewModel, parent: ViewModel, property: PropertyPathItem): void; export declare function removeParent(child: ViewModel, parent: ViewModel, property: PropertyPathItem): void; export declare function destroyViewModelCore(vm: ViewModel): void;