Вы можете получить нужный тип, используя сопоставленные типы. Вы можете получить дополнительные и требуемые ключи от типа, как описано здесь
type OptionalKeys<T> = { [K in keyof T]-?:
({} extends { [P in K]: T[K] } ? K : never)
}[keyof T]
type RequiredKeys<T> = { [K in keyof T]-?:
({} extends { [P in K]: T[K] } ? never : K)
}[keyof T]
type Id<T> = { [P in keyof T]: T[P]}
type OptionalToUndefined<T> = Id<{
[K in OptionalKeys<T>]-?: T[K] | undefined
} & {
[K in RequiredKeys<T>]-?: T[K]
}>
// { y: number | undefined; x: boolean; }
type Foo = OptionalToUndefined<{ x: boolean; y?: number }>