import type { ComputeObject } from './computeObject.js'; type OptionalKeys = { [KEY in keyof OBJECT]-?: {} extends Pick ? KEY : never; }[keyof OBJECT]; type MergeValues = KEY extends OPTIONAL_KEYS ? Exclude | VALUE_B : VALUE_A extends undefined ? VALUE_B : VALUE_A; type Anyfy = { [KEY in keyof OBJECT]: any; }; /** * Accurately merge the fields of `OBJECT_A` with the ones of `OBJECT_B`. * * Optional fields are handled gracefully. */ export type Merge> = ComputeObject<{ [KEY in keyof (Anyfy & OBJECT_B)]: KEY extends keyof OBJECT_A ? KEY extends keyof OBJECT_B ? MergeValues : OBJECT_A[KEY] : KEY extends keyof OBJECT_B ? OBJECT_B[KEY] : never; }>; export {};