type PropertiesThatCanBeUndefined> = { [Key in keyof T]: undefined extends T[Key] ? Key : never; }[keyof T]; /** * OptionalIfCanBeUndefined<{ p1: string | undefined; p2: string; }> * is * { p1?: string | undefined; p2: string } */ export type OptionalIfCanBeUndefined> = { [K in PropertiesThatCanBeUndefined]?: T[K]; } & { [K in Exclude>]: T[K] };