Saltar al contenido
webtype.orgwebtype.orgtsconfig

    ↑↓ mover · ⏎ abrir · esc cerrar

    tsconfig

    useUnknownInCatchVariables

    Lo lanzado no es un Error

    JavaScript puede lanzar cualquier cosa —un string, undefined, un número—, así que el valor capturado es `unknown` y no `any`.

    Desde
    TypeScript 4.4
    strict
    En strict
    En tu tsconfig
    "useUnknownInCatchVariables": true
    Compilado con
    "strict": true

    El mismo fragmento las dos veces. Solo cambió la opción.

    Con ella apagada

    "useUnknownInCatchVariables": false
    export function run() {
      try {
        throw new Error('boom')
      } catch (error) {
        return error.message
      }
    }

    Compila limpio

    Con ella encendida

    "useUnknownInCatchVariables": true
    export function run() {
      try {
        throw new Error('boom')
      } catch (error) {
        return error.message
      }
    }

    Emite TS18046

    Por qué al compilador le importa

    `error.message` sobre un valor capturado es la suposición sin comprobar más común en un código tipado, y se equivoca mucho más de lo que parece: una promesa rechazada con un string, una biblioteca lanzando un objeto plano, un `null` de código anterior a todo esto. `unknown` fuerza el estrechamiento que siempre hizo falta —`error instanceof Error`— y cuesta una línea en cada catch, una vez.

    Conclusión

    Estréchalo una vez en la frontera, no en cada uso dentro del bloque.

    Adónde ir después

    22 opciones