UNPKG

@tienedev/datype

Version:

Modern TypeScript utility library with pragmatic typing and zero dependencies

36 lines 2.37 kB
export type IsPlainObject<T> = T extends Record<string, any> ? T extends readonly unknown[] ? false : T extends (...args: never[]) => unknown ? false : T extends Date ? false : T extends RegExp ? false : true : false; export type DeepMergeResult<T, U> = { [K in keyof T | keyof U]: K extends keyof T ? K extends keyof U ? IsPlainObject<T[K]> extends true ? IsPlainObject<U[K]> extends true ? DeepMergeResult<T[K], U[K]> : U[K] : T[K] extends readonly unknown[] ? U[K] extends readonly unknown[] ? [...T[K], ...U[K]] : U[K] : U[K] : T[K] : K extends keyof U ? U[K] : never; }; export type MergeableObject = Record<string, any>; export interface DeepMergeOptions { arrayMergeStrategy?: 'concat' | 'replace'; maxDepth?: number; } /** * Deeply merges properties from multiple source objects into a target object. * Nested objects are merged recursively. Arrays are concatenated by default. * * @template T - The type of the initial target object * @param target - The target object to merge properties into (will not be mutated) * @param sources - One or more source objects whose properties will be merged * @returns A new object resulting from the merge, ensuring immutability * * @example * ```typescript * import { deepMerge } from 'modash'; * * const config = deepMerge( * { api: { url: '/api', timeout: 5000 }, features: ['auth'] }, * { api: { timeout: 10000 }, features: ['dashboard'] } * ); * // Result: { api: { url: '/api', timeout: 10000 }, features: ['auth', 'dashboard'] } * ``` */ export declare function deepMerge<T extends MergeableObject>(target: T): T; export declare function deepMerge<T extends MergeableObject, U extends MergeableObject>(target: T, source: U): DeepMergeResult<T, U>; export declare function deepMerge<T extends MergeableObject, U extends MergeableObject, V extends MergeableObject>(target: T, source1: U, source2: V): DeepMergeResult<DeepMergeResult<T, U>, V>; export declare function deepMerge<T extends MergeableObject>(target: T, options: DeepMergeOptions): T; export declare function deepMerge<T extends MergeableObject, U extends MergeableObject>(target: T, source: U, options: DeepMergeOptions): DeepMergeResult<T, U>; export declare function deepMerge<T extends MergeableObject>(target: T, ...sourcesAndOptions: Array<MergeableObject | DeepMergeOptions>): T; //# sourceMappingURL=index.d.ts.map