RequireAtLeastOne type

RequireAtLeastOne permet de créer un type dans lequel au moins une des propriétés d’une interface (peut être n’importe quelle propriété) doit exister.

Cela fonctionne en raison des types d’utilitaires de TypeScript : https://www.typescriptlang.org/docs/handbook/utility-types.html examinons-le :

  • [K in keyof T]-? cette propriété (K) est valide uniquement si elle porte le même nom que toute propriété de T.
  • Required<Pick<T, K>> crée un nouveau type à partir de T avec uniquement la propriété actuelle dans l’itération et le marque comme requis
  • Partial<Pick<T, Exclude<keyof T, K>>> crée un nouveau type avec toutes les propriétés de T, à l’exception de la propriété K.
  • & est ce qui unit le type à une seule propriété requise à partir de Required<...> avec toutes les propriétés facultatives de Partial<...>.
  • [keyof T] garantit que seules les propriétés de T sont autorisées.
type RequireAtLeastOne<T> = {
  [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]