import type { Paths, UnknownRecord } from 'type-fest';
type MergedType = A extends UnknownRecord ? B extends UnknownRecord ? A & B : MergedArray : MergedArray;
type MergedArray = A extends any[] ? B extends any[] ? Array : keyof B extends `${number}` ? Array : B : B;
/**
* deep merge an object
* @param source default object if no additional property is supplied
* @param target properties to be merged with the default
* @returns merged object
*/
export declare function merge>(source: S, target?: T): R;
/**
* merge an array with any value
* @param source the source array to be merged
* @param target new replacement
* @returns merged value
*/
export declare function mergeArray(source: S[], target?: T): MergedArray;
/**
* merge two arrays
* @param source the source array to be merged
* @param target new replacement
* @returns merged array
*/
export declare function mergeArrays(source: S[], target: T[]): MergedArray;
/**
* annotate an array for key-based merging during preset resolution
* @param key the property name used to identify matching elements across arrays
* @param items the array of objects to annotate
* @returns a shallow copy of the array with a non-enumerable merge key annotation
*/
export declare function mergeByKey, K extends string & Paths>(key: K, items: T[]): T[];
/**
* merge an object with any value
* @param source the source object to be merged
* @param target new replacement
* @returns merged value
*/
export declare function mergeObject(source: S, target?: T): MergedType;
export {};
//# sourceMappingURL=merge.d.ts.map