// Extracts the keys of an object where the properties are optional type OptionalKeys = { [K in keyof T]-?: {} extends Pick ? K : never }[keyof T] // Extracts the keys of an object where the properties are required type RequiredKeys = { [K in keyof T]-?: {} extends Pick ? never : K }[keyof T] // Type to merge two objects export type MergePreservingOptional = { // Required properties [K in RequiredKeys | RequiredKeys]: K extends keyof T ? K extends keyof U ? T[K] | U[K] // Overlapping keys use a union type : T[K] // Non-overlapping keys retain their original type : K extends keyof U ? U[K] : never } & { // Optional properties [K in OptionalKeys | OptionalKeys]?: K extends keyof T ? K extends keyof U ? T[K] | U[K] // Overlapping keys use a union type : T[K] // Non-overlapping keys retain their original type : K extends keyof U ? U[K] : never }