Wzorce
Jak indeksować dyskryminowaną unię przez `kind`, zamiast wielokrotnie wyciągać składniki?
Mapuj po unii i przemapuj każdy składnik na literalną wartość jego dyskryminatora.
Przepis
type ByKind<Union extends { kind: PropertyKey }> = { [Member in Union as Member['kind']]: Member } type Action = | { kind: 'add'; amount: number } | { kind: 'reset' } | { kind: 'rename'; name: string } type ActionMap = ByKind<Action>
Build to kompiluje i sprawdza każdy wynik poniżej.
Jak to działa
- 01
[Member in UnionTypy mapowane mogą iterować po unii obiektów, nie tylko po unii kluczy właściwości.
- 02
as Member['kind']
Przemapowanie klucza wynosi każdą wartość dyskryminatora do nazwy właściwości.
Co dostajesz
ActionMap['add']→{ kind: "add"; amount: number; }ActionMap['reset']→{ kind: "reset"; }keyof ActionMap→"add" | "reset" | "rename"
Gdzie to zawodzi
Każdy dyskryminator musi być unikalnym `PropertyKey`. Jeśli dwa składniki dzielą ten sam `kind`, ich wartości scalą się pod jedną właściwością i mapa nie wskaże pojedynczego składnika.
Wniosek
Przemapowanie kluczy zamienia dyskryminator unii w indeks do stałoczasowego wyszukiwania typu.
