ค้นหาเว็บไซต์

มีวิธีใดบ้างที่จะเปลี่ยน property ที่เป็น optional เช่น { x?: number } ให้เป็น required (สามารถเป็น undefined ได้) `{ x: undefined | number }` ผ่าน map types ใน TypeScript?


ฉันมีบางอย่างแบบ { y: string; x?: number } ฉันต้องการให้ได้ { y: string; x: undefined | number } มีวิธีใดบ้างที่จะเปลี่ยนสิ่งแรกให้เป็นสิ่งที่สองผ่าน map types ใน TypeScript?

คำตอบ #1

คุณสามารถรับประเภทที่คุณต้องการโดยใช้ mapped types คุณสามารถรับคีย์ที่เป็นทางเลือกและคีย์ที่จำเป็นจากประเภทได้ตามที่อธิบายไว้ที่นี่

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

คำตอบ #2

ฉันก็ลงเอยด้วยการใช้สิ่งนี้:

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