RequireAtLeastOne type

RequireAtLeastOne ayuda a crear un tipo en el que se requiere al menos una de las propiedades de una interfaz (puede ser cualquier propiedad).

Esto funciona debido a los tipos de utilidad de TypeScript: https://www.typescriptlang.org/docs/handbook/utility-types.html vamos a examinarlo:

  • [K in keyof T]-? esta propiedad (K) solo es válida si tiene el mismo nombre que cualquier propiedad de T.
  • Required<Pick<T, K>> convierte un nuevo tipo de T con solo la propiedad actual en la iteración y lo marca como necesario.
  • Partial<Pick<T, Exclude<keyof T, K>>> crea un nuevo tipo con todas las propiedades de T, excepto de la propiedad K.
  • & es lo que une el tipo con solo una propiedad necesaria de Required<...> con todas las propiedades opcionales de Partial<...>.
  • [keyof T] garantiza que solo se permiten las propiedades de T.
type RequireAtLeastOne<T> = {
  [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]