// @ts-ignore - Only used in doc comments import type { SimpleMerge } from "./SimpleMerge"; // @ts-ignore - Only used in doc comments import type SimpleMergeFn from "./SimpleMerge"; import type { Args, Fn } from "../HKT"; import type { AssertObj } from "../helpers"; type _OptionalKeyOf = { [K in keyof O]-?: NonNullable extends { [P in K]: O[K] } ? K : never; }[keyof O]; type _SpreadProperties = { [P in K]: L[P] | Exclude; }; type _Id = T extends infer U ? { [K in keyof U]: U[K] } : never; /** * Merge two objects together. Optional keys are considered. * * However, this can cause some performance issues and may break TS in rare cases, * so it is recommended to use {@link SimpleMerge} when you're sure that * the two objects have no optional properties. * * Sig: `(l: object, r: object) => object` * * @example * ```typescript * type A = { a: number; b?: string }; * type B = { a: boolean; c: string }; * type R = Merge; * // ^?: { a: boolean; b?: string; c: string } * ``` * * @see {@link SimpleMerge} */ export type Merge = AssertObj< _Id< Pick> & Pick>> & Pick, keyof L>> & _SpreadProperties & keyof L> > >; /** * [Fn] Merge two objects together. Optional keys are considered. * * However, this can cause some performance issues and may break TS in rare cases, * so it is recommended to use {@link SimpleMerge} when you're sure that * the two objects have no optional properties. * * Sig: `(l: object, r: object) => object` * * @see {@link SimpleMerge} */ export default interface MergeFn extends Fn<[object, object], object> { def: ([l, r]: Args) => Merge; }