RequireAtLeastOne type

يساعد RequireAtLeastOne على إنشاء نوع حيث يلزم وجود خاصية واحدة على الأقل من خصائص الواجهة (يمكن أن تكون أي خاصية).

يعمل هذا بسبب أنواع الأدوات المساعدة ل TypeScript: https://www.typescriptlang.org/docs/handbook/utility-types.html دعونا نفحصه:

  • [K in keyof T]-? هذه الخاصية (K) صالحة فقط إذا كان لها نفس اسم أي خاصية من خصائص T.
  • يقوم Required<Pick<T, K>> بإنشاء نوع جديد من T مع الخاصية الحالية فقط في التكرار، ووضع علامة عليه على أنه مطلوب
  • Partial<Pick<T, Exclude<keyof T, K>>> يجعل نوع جديد مع كافة خصائص T، باستثناء من الخاصية K.
  • & هو ما يوحد النوع بخاصية واحدة مطلوبة فقط من Required<...> مع جميع الخصائص الاختيارية من Partial<...>.
  • يضمن [keyof T] السماح بخصائص T فقط.
type RequireAtLeastOne<T> = {
  [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]