Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS7053

    Niejawne any z indeksu tekstowego

    Element implicitly has an 'any' type because expression of type 'string' can't be used to index type

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Zaindeksowałeś obiekt zwykłym `string`, a kompilator nie umie stwierdzić, którą właściwość masz na myśli — wynikiem byłoby `any`, a `strict` nie przepuści tego po cichu.

    Odtworzenie

    declare const obj: { a: number }
    declare const key: string
    
    const value = obj[key]

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    `string` to każdy tekst, a `obj` ma dokładnie jeden klucz. Kompilator nie może wykluczyć `obj["bzdura"]`, które nie ma żadnego typu, więc uczciwym wynikiem jest `any` — a przy `noImplicitAny` `any`, o które nie prosiłeś, jest błędem, a nie cichą dziurą. Komunikat opisuje lukę w jego wiedzy, a nie błąd w tym, co napisałeś.

    Naprawy

    1. 01
      declare const obj: { a: number }
      declare const key: keyof typeof obj
      
      const value = obj[key]

      Zawęź klucz do kluczy, które istnieją. `keyof typeof obj` to `"a"`, a indeksowanie nim jest dokładne.

    2. 02
      declare const obj: Record<string, number>
      declare const key: string
      
      const value = obj[key]

      Albo powiedz, że obiekt naprawdę przyjmuje dowolny tekst. Sygnatura indeksu to obietnica o każdym kluczu i jest właściwą odpowiedzią, gdy obiekt jest słownikiem, a nie ustalonym kształtem.

    Wniosek

    Zdecyduj, czym obiekt jest: ustalonym kształtem indeksowanym własnymi kluczami czy słownikiem przyjmującym cokolwiek. Większość tych błędów to obiekt używany jako jedno i drugie naraz.

    Dokąd dalej

    Błędy