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 requisPartial<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 deRequired<...>
avec toutes les propriétés facultatives dePartial<...>
.[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]