declare type Input = Record; declare type Merger = (obj: T, key: keyof T, value: T[K], namespace: string) => any; declare type MergeObjects = Destination extends Defaults ? Destination : Omit & Omit & { -readonly [Key in keyof Destination & keyof Defaults]: Destination[Key] extends null ? Defaults[Key] extends null ? null : Defaults[Key] : Defaults[Key] extends null ? Destination[Key] : Merge; }; declare type DefuFn = (source: Source, ...defaults: Defaults[]) => MergeObjects; interface Defu { (source: Source, ...defaults: Defaults[]): MergeObjects; fn: DefuFn; arrayFn: DefuFn; extend(merger?: Merger): DefuFn; } declare type MergeArrays = Destination extends Array ? Source extends Array ? Array : Source | Array : Source | Destination; declare type Merge = Destination extends null ? Defaults extends null ? null : Defaults : Defaults extends null ? Destination : Destination extends Array ? Defaults extends Array ? MergeArrays : Destination | Defaults : Destination extends Function ? Destination | Defaults : Destination extends RegExp ? Destination | Defaults : Destination extends Promise ? Destination | Defaults : Defaults extends Function ? Destination | Defaults : Defaults extends RegExp ? Destination | Defaults : Defaults extends Promise ? Destination | Defaults : Destination extends Input ? Defaults extends Input ? MergeObjects : Destination | Defaults : Destination | Defaults; declare const defu: Defu; export default defu;