آیا راهی وجود دارد تا یک ویژگی اختیاری مانند { x?: number } را به اجباری (غیرقابل تعریف) `{ x: undefined | number }` از طریق نوعهای نگاشتی در تایپاسکریپت تبدیل کرد؟


من چیزی شبیه { y: string; x?: number } دارم، و نیاز دارم به { y: string; x: undefined | number }. آیا راهی وجود دارد که اولی را از طریق نوعهای نگاشتی در تایپاسکریپت به دومی تبدیل کرد؟

پاسخ شماره ۱

شما میتوانید با استفاده از نوعهای نگاشتشده نوع مورد نظر خود را دریافت کنید. شما میتوانید کلیدهای اختیاری و اجباری را از یک نوع همانطور که در اینجا توضیح داده شده است، دریافت کنید.

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 }> 

پاسخ شماره ۲

در نهایت از این استفاده کردم:

type EachNonOptional<T> = { [K in keyof T]-?: T[K]; }
type EachUndefinedOrNever<T> = { [K in keyof T]: undefined extends T[K] ? undefined : never };
type EachOptionalAsUndefined<T> = { [K in keyof EachNonOptional<T>]: EachNonOptional<T>[K] | EachUndefinedOrNever<T>[K] };
declare const x: EachOptionalAsUndefined<{ x?: number; y: string}>; // {x : number | undefined; x: string; }

یا حتی سادهتر:

type EachNonOptional<T> = { [K in keyof T]-?: T[K]; }
type EachOptionalAsUndefined<T> = { [K in keyof EachNonOptional<T>]: T[K] };