function isObject(item: unknown): item is object { return item !== null && typeof item === "object" } /** Deep merge two or more objects */ export function merge>( target: T, ...sources: Array | undefined> ): T & Record { if (!sources.length) return target const source = sources.shift() if (isObject(target) && isObject(source)) { for (const key in source) { if (isObject(source[key])) { if (!isObject(target[key])) (target as Record)[key] = Array.isArray(source[key]) ? [] : {} merge( (target as Record)[key] as T, source[key] as Record ) } else if (source[key] !== undefined) (target as Record)[key] = source[key] } } return merge(target, ...sources) }