pnpm add object-deep-merge
yarn add object-deep-merge
npm install object-deep-merge
import { merge } from "object-deep-merge";
const merged = merge({ foo: false }, { bar: true }); console.log({ merged });
{ "merged": { "foo": false, "bar": true } }
merge Type SignatureThe merge function accepts two optional type generics. TData and TResult.
function merge<TData extends MergeableObject = MergeableObject, TResult extends MergeableObject = TData>( source: TData, target: TData, ...targets: Array<TData> ): TResult;
[!IMPORTANT]
TheMergeandMergeDeeptypes fromtype-festare 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.
TData will validate the shape of the objects passed 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.type Data = { name: string; description: string; }; const base: Data = { name: "object-deep-merge", description: "merge objects" }; const overrides: Partial<Data> = { description: "merge objects, deeply" }; const merged = merge(base, overrides); // Type is inferred so the signature becomes: // function merge<Partial<Data>, Partial<Data>>(source: Partial<Data>, target: Partial<Data>, ...targets: Partial<Data>[]): Partial<Data> // TData = Partial<Data> // TResult = Data console.log({ merged });
{ "merged": { "name": "object-deep-merge", "description": "merge objects, deeply" } }
TData Generic[!NOTE] Passing in TData will validate the shape of the objects passed in.
type Data = { name: string; description: string; }; const base: Data = { name: "object-deep-merge", description: "merge objects" }; const overrides: Partial<Data> = { description: "merge objects, deeply" }; const merged: Partial<Data> = merge<Partial<Data>>(base, overrides); // TData = Partial<Data> // TResult = Data console.log({ merged });
{ "merged": { "name": "object-deep-merge", "description": "merge objects, deeply" } }
TData and TResult Generics[!NOTE] Passing in
TResultwill override the output type. While this should be used sparingly, it provides a convenient approach for correctly typing partial types into complete types.
type Data = { name: string; description: string; }; const base: Data = { name: "object-deep-merge", description: "merge objects" }; const overrides: Partial<Data> = { description: "merge objects, deeply" }; const merged: Data = merge<Partial<Data>, Data>(base, overrides); // TData = Partial<Data> // TResult = Data console.log({ merged });
{ "merged": { "name": "object-deep-merge", "description": "merge objects, deeply" } }