Saltar al contenido
webtype.orgwebtype.orgTS1196

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS1196

    Tipar la variable de catch

    Catch clause variable type annotation must be 'any' or 'unknown' if specified.

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

    JavaScript permite lanzar cualquier cosa, así que el compilador no puede prometer que lo que llegue a un catch sea un `Error`. `unknown` es la única anotación honesta.

    Reproducción

    try {
      JSON.parse('{')
    } catch (error: Error) {
      throw error
    }

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

    Por qué lo dice el compilador

    `throw` acepta cualquier valor — una cadena, un número, `undefined`, un objeto que solo se parece a un error — y el punto de lanzamiento puede estar en cualquier sitio, incluida una biblioteca que no controlas. Una anotación normal es una afirmación que el compilador comprueba en cada asignación; esta no podría comprobarla nunca, porque no hay asignación que mirar. Por eso el lenguaje permite exactamente los dos tipos que no afirman nada: `unknown`, que te obliga a estrechar, y `any`, que existe para código escrito antes de que eso fuera posible.

    Arreglos

    1. 01
      try {
        JSON.parse('{')
      } catch (error: unknown) {
        if (error instanceof SyntaxError) throw error
        throw new Error(String(error))
      }

      Anota `unknown` y estrecha con `instanceof`. La comprobación que te saltabas es la que hace seguro el resto del bloque.

    2. 02
      try {
        JSON.parse('{')
      } catch (error) {
        const reason = error instanceof Error ? error.message : String(error)
        throw new Error(reason)
      }

      O no escribas ninguna anotación. Bajo `strict` la variable ya es `unknown`, así que la anotación nunca añadía nada.

    Conclusión

    No puedes declarar lo que vas a capturar, solo lo que vas a aceptar. Estrecha dentro del bloque y trata «es un Error» como algo que comprobar, no que suponer.

    Errores