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 la marca según sea necesario. -
Partial<Pick<T, Exclude<keyof T, K>>>
convierte un nuevo tipo con todas las propiedades de T, excepto en 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]