Przejdź do treści
webtype.orgwebtype.orgTS1196

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    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

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

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

    Błędy