Type Alias Merge<A, B, Options>

Merge: Or<
    IsAny<A>,
    IsAny<B>,
    {
        $else: Or<
            IsNever<A>,
            IsNever<B>,
            {
                $else: IsDisjoint<A, B> extends true
                    ? A & B
                    : [keyof A, keyof B] extends [
                        infer KA extends KeyTypes,
                        infer KB extends KeyTypes,
                    ]
                        ? IsLiteral<KA> extends true
                            ? IsLiteral<KB> extends true
                                ? [OptionalKeys<(...)>, OptionalKeys<(...)>] extends [
                                    infer PKA extends (...),
                                    infer PKB extends (...),
                                ]
                                    ? (...) & (...) & (...) & (...)
                                    : never
                                : ((...) extends (...) ? (...) : (...)) & (
                                    (...) extends (...) ? (...) : (...)
                                ) & ((...) extends (...) ? (...) : (...))
                            : IsLiteral<KB> extends true
                                ? { [k in Exclude<(...), (...)>]: (...)[(...)] } & {
                                    [k in keyof (...)]: (...)[(...)]
                                }
                                : ((...) extends (...) ? (...) : (...)) & (
                                    (...) extends (...) ? (...) : (...)
                                ) & ((...) extends (...) ? (...) : (...))
                        : never;
                $then: never;
            },
        >;
        $then: any;
    },
>

⚗️ transform 🔢 customizable

Merges type A and type B.

This type performs the same operations as { ...a, ...b } but at the type level.

It handles cases like A or B are Record, joining between required and optional props, etc.

Type Parameters