Saltar al contenido

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS2542

    Firma de índice de solo lectura

    Index signature in type '{ readonly [k: string]: number; }' only permits reading.

    Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.

    El objeto acepta cualquier clave de cadena, y todas ellas son de solo lectura. Es TS2540 aplicado a toda una familia de claves a la vez.

    Reproducción

    declare const ro: { readonly [k: string]: number }
    
    ro.x = 1

    La compilación afirma que esto emite exactamente este código.

    Por qué lo dice el compilador

    Una firma de índice `readonly` es como describes una tabla de consulta que no debe editarse in situ — una configuración congelada, un mapa memoizado que entregas, el resultado de un mapeo que no quieres que se mute. El modificador se aplica a claves que aún no existen, y esa es la parte que sorprende: no hay clave que puedas inventar que sea escribible.

    Arreglos

    1. 01
      declare const ro: { [k: string]: number }
      
      ro.x = 1

      Quita `readonly` si la tabla de verdad debe editarse.

    2. 02
      declare const ro: { readonly [k: string]: number }
      
      const next: { readonly [k: string]: number } = { ...ro, x: 1 }

      O espárcela en una nueva. El original sigue siendo válido para quien lo tenga, que es la razón por la que era `readonly`.

    Conclusión

    `readonly` en una firma de índice es una afirmación sobre todas las claves, presentes y futuras. Es la inmutabilidad más fuerte que ofrece el sistema de tipos, y aun así desaparece en tiempo de ejecución.

    Adónde ir después

    Errores