Condividi tramite


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 da Required<...> con tutte le proprietà facoltative di Partial<...>.
  • [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]