TS-Scribe - v1.2.0
    Preparing search index...

    Type Alias DeepMerge<A, B>

    DeepMerge: A extends ReadonlyArray<infer AItem>
        ? B extends ReadonlyArray<infer BItem> ? DeepMerge<AItem, BItem>[] : B
        : B extends readonly any[]
            ? B
            : A extends Record<string, any>
                ? B extends Record<string, any>
                    ? Simplify<
                        Omit<A, keyof B> & {
                            [K in keyof B]: K extends keyof A ? DeepMerge<A[K], B[K]> : B[K]
                        },
                    >
                    : B
                : B

    Deeply merge two types recursively, with B taking precedence over A.

    • Primitives (including Date, RegExp, Map, Set, etc.): B overwrites A.
    • Arrays: element types are merged via DeepMerge and wrapped in Array<>. This is safe for both the 'replace' and 'concat' array strategies at runtime.
    • Plain objects: properties are recursively merged. Keys present only in A keep their original type; keys present only in B use B's type; overlapping keys are deeply merged with B's property taking precedence.
    • Mixed types (e.g. A is an object, B is a primitive): B wins.

    Type Parameters

    • A

      The base type (lower precedence).

    • B

      The overriding type (higher precedence).

    type User = { name: string; meta: { visits: number } };
    type Patch = { meta: { lastSeen: Date }; age: number };
    type Merged = DeepMerge<User, Patch>;
    // Merged = { name: string; meta: { visits: number; lastSeen: Date }; age: number }