آیا راهی وجود دارد تا یک ویژگی اختیاری مانند { 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] };
