TS1196
Typ zmiennej w catch
Catch clause variable type annotation must be 'any' or 'unknown' if specified.Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.
JavaScript pozwala rzucić cokolwiek, więc kompilator nie może obiecać, że w bloku catch wyląduje `Error`. `unknown` to jedyna uczciwa adnotacja.
Odtworzenie
try {
JSON.parse('{')
} catch (error: Error) {
throw error
}Build potwierdza, że to emituje dokładnie ten kod.
Dlaczego kompilator tak mówi
`throw` przyjmuje dowolną wartość — łańcuch, liczbę, `undefined`, obiekt jedynie przypominający błąd — a miejsce rzucenia może być gdziekolwiek, także w bibliotece, nad którą nie masz kontroli. Zwykła adnotacja to twierdzenie, które kompilator sprawdza przy każdym przypisaniu; tego nie sprawdziłby nigdy, bo nie ma przypisania, na które mógłby spojrzeć. Dlatego język dopuszcza dokładnie te dwa typy, które niczego nie twierdzą: `unknown`, który zmusza cię do zawężenia, i `any`, który istnieje dla kodu napisanego, zanim było to możliwe.
Naprawy
- 01
try { JSON.parse('{') } catch (error: unknown) { if (error instanceof SyntaxError) throw error throw new Error(String(error)) }Zaadnotuj `unknown` i zawęź przez `instanceof`. Sprawdzenie, które pomijałeś, jest tym, co czyni resztę bloku bezpieczną.
- 02
try { JSON.parse('{') } catch (error) { const reason = error instanceof Error ? error.message : String(error) throw new Error(reason) }Albo nie pisz adnotacji wcale. Pod `strict` zmienna i tak jest `unknown`, więc adnotacja nigdy niczego nie wnosiła.
Wniosek
Nie możesz zadeklarować, co złapiesz — tylko co przyjmiesz. Zawężaj wewnątrz bloku i traktuj „to jest Error” jako coś do sprawdzenia, nie do założenia.

