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": falseexport function run() { try { throw new Error('boom') } catch (error) { return error.message } }
Kompiluje się czysto
Z włączoną
"useUnknownInCatchVariables": trueexport 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

