Wzorce
Jak przyjąć jeden klucz wyszukiwania, odrzucając pustą kwerendę i kwerendę z kilkoma kluczami?
Zbuduj wariant dla każdego klucza: wymagaj go i zabroń wszystkich pozostałych przez opcjonalne `never`.
Przepis
type ExactlyOne<T> = { [K in keyof T]: Required<Pick<T, K>> & Partial<Record<Exclude<keyof T, K>, never>> }[keyof T] type Search = ExactlyOne<{ id: string email: string handle: string }>
Build to kompiluje i sprawdza każdy wynik poniżej.
Jak to działa
- 01
Required<Pick<T, K>>
Bieżący wariant wymaga wybranego klucza.
- 02
Partial<Record<Exclude<keyof T, K>, never>>
Każdy niewybrany klucz jest opcjonalny, ale zabroniony, gdy się pojawi.
Co dostajesz
{ id: string } extends Search ? true : false→true{} extends Search ? true : false→false{ id: string; email: string } extends Search ? true : false→false
Gdzie to zawodzi
Podobnie jak `AtLeastOne`, tworzy jeden składnik unii na klucz. Utrzymuj mały obiekt źródłowy, bo komunikaty i praca edytora szybko rosną.
Wniosek
Wymagaj wybranego klucza, zabroń reszty, a potem zindeksuj mapowaną tabelę, by utworzyć unię.
