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 deRequired<...>
con todas las propiedades opcionales dePartial<...>
.[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]