RequireAtLeastOne type
RequireAtLeastOne pomaga utworzyć typ, w którym co najmniej jedna z właściwości interfejsu (może być dowolną właściwością) musi istnieć.
Działa to z powodu typów narzędzi języka TypeScript: https://www.typescriptlang.org/docs/handbook/utility-types.html Przyjrzyjmy się temu:
-
[K in keyof T]-?
ta właściwość (K) jest prawidłowa tylko wtedy, gdy ma taką samą nazwę jak dowolna właściwość T. -
Required<Pick<T, K>>
tworzy nowy typ z języka T z tylko bieżącą właściwością w iteracji i oznacza go zgodnie z potrzebami -
Partial<Pick<T, Exclude<keyof T, K>>>
tworzy nowy typ ze wszystkimi właściwościami języka T, z wyjątkiem właściwości K. -
&
to, co łączy typ z tylko jedną wymaganą właściwością zRequired<...>
ze wszystkimi opcjonalnymi właściwościami zPartial<...>
. -
[keyof T]
gwarantuje, że dozwolone są tylko właściwości T.
type RequireAtLeastOne<T> = {
[K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]