deepMerge(target, source) merges two objects recursively. It's a common utility for merging configs, themes, or default values with overrides.
deepMerge(
{ a: 1, b: { x: 10, y: 20 }, c: [1, 2] },
{ b: { y: 99, z: 30 }, c: [7, 8, 9] }
)
// → { a: 1, b: { x: 10, y: 99, z: 30 }, c: [7, 8, 9] }
// ^ preserved ^ overridden ^ new key ^ array replacedThe recursive DeepMerge<A, B> utility type produces the correct output type:
type DeepMerge<A, B> = {
[K in keyof A | keyof B]:
K extends keyof B
? K extends keyof A
? A[K] extends object ? DeepMerge<A[K], B[K]> : B[K]
: B[K]
: K extends keyof A ? A[K] : never;
};Sample tests