RequireAtLeastOne type
RequireAtLeastOne ajuda a criar um tipo onde pelo menos uma das propriedades de uma interface (pode ser qualquer propriedade) é necessária para existir.
Isso funciona devido aos tipos de utilidade do TypeScript: https://www.typescriptlang.org/docs/handbook/utility-types.html Vamos examiná-lo:
-
[K in keyof T]-?esta propriedade (K) só é válida se tiver o mesmo nome que qualquer propriedade de T. -
Required<Pick<T, K>>cria um novo tipo de T apenas com a propriedade atual na iteração e a marca conforme necessário -
Partial<Pick<T, Exclude<keyof T, K>>>faz um novo tipo com todas as propriedades de T, exceto da propriedade K. -
&é o que une o tipo com apenas uma propriedade necessária deRequired<...>com todas as propriedades opcionais dePartial<...>. -
[keyof T]garante que apenas as propriedades de T sejam permitidas.
type RequireAtLeastOne<T> = {
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]