Saltar al contenido
Convertir una unión en mapa de consulta

    ↑↓ mover · ⏎ abrir · esc cerrar

    Patrones

    ¿Cómo indexo una unión discriminada por su `kind` en vez de extraer miembros repetidamente?

    Mapea la unión y remapea cada miembro al valor literal de su discriminante.

    La receta

    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>

    La compilación compila esto y comprueba cada resultado de abajo.

    Cómo funciona

    1. 01
      [Member in Union

      Los tipos mapeados pueden iterar una unión de objetos, no solo una unión de claves.

    2. 02
      as Member['kind']

      El remapeo convierte cada discriminante en nombre de propiedad.

    Lo que obtienes

    Dónde falla

    Cada discriminante debe ser un `PropertyKey` único. Si dos miembros comparten `kind`, sus valores se fusionan bajo una propiedad y el mapa deja de identificar un único miembro.

    Conclusión

    El remapeo convierte el discriminante de una unión en índice para consultar tipos en tiempo constante.

    Véase también

    Patrones