import { WatchOptions, WatchSource, WatchStopHandle } from 'vue';
type UnwrapSource<T> = T extends WatchSource<infer V> ? V : T extends object ? T : never;
type Changes<T> = Partial<{
    [K in keyof T]: {
        old: UnwrapSource<T[K]> | undefined;
        new: UnwrapSource<T[K]>;
    };
}>;
/**
 * useWatch — расширенный `watch` с измененным callback
 * - принимает объект с реактивными свойствами, точно такими же, как при указании в массиве в стандартном `watch`
 * - callback возвращает изменившиеся свойства в объекте `changes` с `{old, new}`
 *
 * Если у вас есть несколько `watch`, которые меняют одно состояние, то могут возникнуть проблемы:
 * - рост длины цепочек `watch`, когда один `watch` приводит к срабатыванию другого
 * - лишние вызовы при согласованных состояниях, когда разные `watch` устанавливают одно и то же значение
 * - гонка при несогласованных состояниях, когда разные `watch` в разные тики при этом одновременно могут устанавливать разные состояния
 *
 * Если у вас такой случай и его нельзя упростить, то используйте `useWatch`, в остальных случаях используйте только стандартный `watch`
 *
 * @example
 *
 * ```js
 *
 * useWatch({ a: ref(5), b: ref('word') }, (changes) => {
 * 	console.log(changes.a?.new, changes.a?.old);
 * 	console.log(changes.b?.new, changes.b?.old);
 * });
 * ```
 */
export declare function useWatch<T extends Record<string, WatchSource>>(sourcesObj: T, cb: (changes: Changes<T>, onCleanup: (fn: () => void) => void) => void | Promise<void>, options?: WatchOptions): WatchStopHandle;
export {};
