Przejdź do treści
webtype.orgwebtype.orgtsconfig

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    tsconfig

    useUnknownInCatchVariables

    To, co rzucono, nie jest błędem

    JavaScript może rzucić cokolwiek — string, undefined, liczbę — więc przechwycona wartość jest `unknown`, a nie `any`.

    Od
    TypeScript 4.4
    strict
    W strict
    W twoim tsconfigu
    "useUnknownInCatchVariables": true
    Skompilowane z
    "strict": true

    Ten sam fragment za każdym razem. Zmieniła się tylko opcja.

    Z wyłączoną

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

    Kompiluje się czysto

    Z włączoną

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

    Zgłasza TS18046

    Dlaczego kompilator się tym przejmuje

    `error.message` na przechwyconej wartości to najczęstsze niesprawdzone założenie w otypowanej bazie kodu i myli się znacznie częściej, niż się wydaje: odrzucona obietnica niosąca string, biblioteka rzucająca zwykły obiekt, `null` z kodu starszego niż to wszystko. `unknown` wymusza zawężenie, które i tak było konieczne — `error instanceof Error` — a kosztuje jedną linijkę przy każdym catchu, raz.

    Wniosek

    Zawęź raz na granicy, a nie przy każdym użyciu wewnątrz bloku.

    Gdzie iść dalej

    Opcji: 22