remeda
Version:
A utility library for JavaScript and Typescript.
35 lines (32 loc) • 2.16 kB
TypeScript
import { MergeDeep } from 'type-fest';
/**
* Merges the `source` object into the `destination` object. The merge is similar to performing `{ ...destination, ... source }` (where disjoint values from each object would be copied as-is, and for any overlapping props the value from `source` would be used); But for *each prop* (`p`), if **both** `destination` and `source` have a **plain-object** as a value, the value would be taken as the result of recursively deepMerging them (`result.p === deepMerge(destination.p, source.p)`).
*
* @param destination - The object to merge into. In general, this object would have it's values overridden.
* @param source - The object to merge from. In general, shared keys would be taken from this object.
* @returns The merged object.
* @signature
* R.mergeDeep(destination, source)
* @example
* R.mergeDeep({ foo: 'bar', x: 1 }, { foo: 'baz', y: 2 }) // => { foo: 'baz', x: 1, y: 2 }
* @dataFirst
* @category Object
*/
declare function mergeDeep<Destination extends object, Source extends object>(destination: Destination, source: Source): MergeDeep<Destination, Source>;
/**
* Merges the `source` object into the `destination` object. The merge is similar to performing `{ ...destination, ... source }` (where disjoint values from each object would be copied as-is, and for any overlapping props the value from `source` would be used); But for *each prop* (`p`), if **both** `destination` and `source` have a **plain-object** as a value, the value would be taken as the result of recursively deepMerging them (`result.p === deepMerge(destination.p, source.p)`).
*
* @param source - The object to merge from. In general, shared keys would be taken from this object.
* @returns The merged object.
* @signature
* R.mergeDeep(source)(destination)
* @example
* R.pipe(
* { foo: 'bar', x: 1 },
* R.mergeDeep({ foo: 'baz', y: 2 }),
* ); // => { foo: 'baz', x: 1, y: 2 }
* @dataLast
* @category Object
*/
declare function mergeDeep<Source extends object>(source: Source): <Destination extends object>(target: Destination) => MergeDeep<Destination, Source>;
export { mergeDeep };