Strongly-typed deep and recursive object merging. Considers all nested levels of objects, arrays, sets and maps.

Strongly-typed deep and recursive object merging with support for all value types.
``bash`
pnpm add object-deep-merge
`bash`
yarn add object-deep-merge
`bash`
npm install object-deep-merge
`ts`
import { merge } from "object-deep-merge";
`ts
const merged = merge({ foo: false }, { bar: true });
console.log({ merged });
`
Output
`json`
{
"merged": {
"foo": false,
"bar": true
}
}
The merge function accepts two optional type generics. TData and TResult.
`ts`
function merge
source: TData,
target: TData,
...targets: Array
): TResult;
> [!IMPORTANT]
> The Merge and MergeDeep types from type-fest are great additions to this library. It is not unreasonable to use those types for your merge typing needs.
Without explicitly passing in types the function will infer the shape of the object(s) passed in.
- Passing in TData will validate the shape of the objects passed in.TResult
- Passing in will override the output type. While this should be used sparingly, it provides a convenient approach for correctly typing partial types into complete types.
`ts
type Data = {
name: string;
description: string;
};
const base: Data = { name: "object-deep-merge", description: "merge objects" };
const overrides: Partial = { description: "merge objects, deeply" };
const merged = merge(base, overrides);
// Type is inferred so the signature becomes:
// function merge
// TData = Partial
// TResult = Data
console.log({ merged });
`
Output
`json`
{
"merged": {
"name": "object-deep-merge",
"description": "merge objects, deeply"
}
}
> [!NOTE]
> Passing in TData will validate the shape of the objects passed in.
`ts
type Data = {
name: string;
description: string;
};
const base: Data = { name: "object-deep-merge", description: "merge objects" };
const overrides: Partial = { description: "merge objects, deeply" };
const merged: Partial = merge
// TData = Partial
// TResult = Data
console.log({ merged });
`
Output
`json`
{
"merged": {
"name": "object-deep-merge",
"description": "merge objects, deeply"
}
}
> [!NOTE]
> Passing in TResult will override the output type. While this should be used sparingly, it provides a convenient approach for correctly typing partial types into complete types.
`ts
type Data = {
name: string;
description: string;
};
const base: Data = { name: "object-deep-merge", description: "merge objects" };
const overrides: Partial = { description: "merge objects, deeply" };
const merged: Data = merge
// TData = Partial
// TResult = Data
console.log({ merged });
`
Output
`json``
{
"merged": {
"name": "object-deep-merge",
"description": "merge objects, deeply"
}
}