23 lines · 694 B · TypeScript
RawDownload
import * as P from "effect/Predicate"; export type DeepPartial<T> = T extends readonly (infer U)[]  ? readonly DeepPartial<U>[]  : T extends object    ? { [K in keyof T]?: DeepPartial<T[K]> }    : T; export function deepMerge<T extends Record<string, unknown>>(current: T, patch: DeepPartial<T>): T {  if (!P.isObject(current) || !P.isObject(patch)) {    return patch as T;  }   const next = { ...current } as Record<string, unknown>;  for (const [key, value] of Object.entries(patch)) {    if (value === undefined) continue;     const existing = next[key];    next[key] = P.isObject(existing) && P.isObject(value) ? deepMerge(existing, value) : value;  }   return next as T;}