@tienedev/datype
Version:
Modern TypeScript utility library with pragmatic typing and zero dependencies
36 lines • 2.37 kB
TypeScript
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