Saltar al contenido

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS7053

    any implícito por un índice de cadena

    Element implicitly has an 'any' type because expression of type 'string' can't be used to index type

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

    Indexaste un objeto con un `string` a secas, y el compilador no puede saber a qué propiedad te referías — el resultado sería `any`, y `strict` no lo deja pasar en silencio.

    Reproducción

    declare const obj: { a: number }
    declare const key: string
    
    const value = obj[key]

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

    Por qué lo dice el compilador

    `string` es toda cadena, y `obj` tiene exactamente una clave. El compilador no puede descartar `obj["tontería"]`, que no tiene tipo alguno, así que el resultado honesto es `any` — y bajo `noImplicitAny`, un `any` que no pediste es un error y no un agujero silencioso. El mensaje describe un hueco en lo que sabe, no un fallo en lo que escribiste.

    Arreglos

    1. 01
      declare const obj: { a: number }
      declare const key: keyof typeof obj
      
      const value = obj[key]

      Acota la clave a las claves que existen. `keyof typeof obj` es `"a"`, e indexar con ella es exacto.

    2. 02
      declare const obj: Record<string, number>
      declare const key: string
      
      const value = obj[key]

      O di que el objeto de verdad acepta cualquier cadena. Una firma de índice es una promesa sobre todas las claves, y es la respuesta correcta cuando el objeto es un diccionario y no una forma fija.

    Conclusión

    Decide qué es el objeto: una forma fija que indexas por sus propias claves, o un diccionario que acepta cualquiera. La mayoría de estos errores son un objeto usado como ambas cosas.

    Adónde ir después

    Errores