/** Include property keys from T where the property is assignable to U */ type IncludeUndefined = { [P in keyof T]: undefined extends T[P] ? P : never }[keyof T] /** Excludes property keys from T where the property is assignable to U */ type ExcludeUndefined = { [P in keyof T]: undefined extends T[P] ? never : P }[keyof T] type OnlyOptionalUndefinedTypes = { [K in IncludeUndefined]?: T[K] } type OnlyNonUndefinedTypes = { [K in ExcludeUndefined]: T[K] } export type ToOptional = OnlyOptionalUndefinedTypes & OnlyNonUndefinedTypes