Przejdź do treści
Zamień unię w mapę odnośników

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    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

    1. 01
      [Member in Union

      Typy mapowane mogą iterować po unii obiektów, nie tylko po unii kluczy właściwości.

    2. 02
      as Member['kind']

      Przemapowanie klucza wynosi każdą wartość dyskryminatora do nazwy właściwości.

    Co dostajesz

    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.

    Zobacz też

    Wzorce