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
- 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.
- 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.

