RequireAtLeastOne type
RequireAtLeastOne consente di creare un tipo in cui sia necessaria almeno una delle proprietà di un'interfaccia (può essere qualsiasi proprietà).
Questo funziona a causa dei tipi di utilità di TypeScript: https://www.typescriptlang.org/docs/handbook/utility-types.html Esaminiamolo:
-
[K in keyof T]-?
questa proprietà (K) è valida solo se ha lo stesso nome di qualsiasi proprietà di T. -
Required<Pick<T, K>>
crea un nuovo tipo da T con solo la proprietà corrente nell'iterazione e la contrassegna come richiesto -
Partial<Pick<T, Exclude<keyof T, K>>>
crea un nuovo tipo con tutte le proprietà di T, ad eccezione della proprietà K. -
&
è ciò che unisce il tipo con una sola proprietà obbligatoria daRequired<...>
con tutte le proprietà facoltative diPartial<...>
. -
[keyof T]
garantisce che siano consentite solo le proprietà di T.
type RequireAtLeastOne<T> = {
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]