type DeepMergeFn = (target: T1, source: T2) => DeepMerge; type DeepMergeAllFn = >(...targets: T) => DeepMergeAll<{}, T>; type Primitive = | null | undefined | string | number | boolean | symbol | bigint; type BuiltIns = Primitive | Date | RegExp; type MergeArrays = T extends readonly any[] ? U extends readonly any[] ? [...T, ...U] : never : never type DifferenceKeys< T, U, T0 = Omit & Omit, T1 = { [K in keyof T0]: T0[K] } > = T1 type IntersectionKeys = Omit> type DeepMergeHelper< T, U, T0 = DifferenceKeys & { [K in keyof IntersectionKeys]: DeepMerge }, T1 = { [K in keyof T0]: T0[K] } > = T1 type DeepMerge = U extends BuiltIns ? U : [T, U] extends [readonly any[], readonly any[]] ? MergeArrays : [T, U] extends [{ [key: string]: unknown }, { [key: string]: unknown }] ? DeepMergeHelper : U type First = T extends [infer _I, ...infer _Rest] ? _I : never; type Rest = T extends [infer _I, ...infer _Rest] ? _Rest : never type DeepMergeAll = First extends never ? R : DeepMergeAll>, Rest>; type MergeArrayFnOptions = { clone: (value: any) => any; isMergeableObject: (value: any) => boolean; deepmerge: DeepMergeFn; getKeys: (value: object) => string[]; } type MergeArrayFn = (options: MergeArrayFnOptions) => (target: any[], source: any[]) => any[] interface Options { mergeArray?: MergeArrayFn; symbols?: boolean; all?: boolean; } type DeepmergeConstructor = typeof deepmerge declare namespace deepmerge { export { Options } export const deepmerge: DeepmergeConstructor export { deepmerge as default } } declare function deepmerge(options: Options & { all: true }): DeepMergeAllFn; declare function deepmerge(options?: Options): DeepMergeFn; export = deepmerge