Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS2536

    Nie może indeksować

    Type 'K' cannot be used to index type 'T'.

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

    Zaindeksowałeś parametr typu innym parametrem typu, a kompilator nie ma powodu wierzyć, że taki klucz istnieje.

    Odtworzenie

    type Get<T, K> = T[K]

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

    Dlaczego kompilator tak mówi

    Wewnątrz generyka `T` nie jest jeszcze obiektem — jest obietnicą, że jakiś przyjdzie. `K` nie jest jego kluczem, tylko kolejną niewiadomą. Prośba o `T[K]` to prośba, by kompilator zagwarantował coś o dwóch rzeczach, których nigdy nie widział. Naprawą nie jest rzutowanie, tylko powiedzenie mu, jak te dwie rzeczy się mają do siebie.

    Naprawy

    1. 01
      type Get<T, K extends keyof T> = T[K]
      
      type Name = Get<{ name: string }, 'name'>

      Ogranicz `K` do `keyof T`. Teraz zależność jest zapisana i kompilator może sprawdzić każde wywołanie, zamiast ufać jednemu.

    2. 02
      type Get<T, K> = K extends keyof T ? T[K] : never
      
      type Missing = Get<{ name: string }, 'nope'>

      Albo pytaj w miejscu użycia zamiast w drzwiach. To przyjmuje dowolne `K` i odpowiada `never` na klucze, których nie ma — właściwy kształt, gdy brakujący klucz jest normalną odpowiedzią, a nie pomyłką.

    Wniosek

    Ograniczenia to sposób, w jaki dwa parametry typu zostają sobie przedstawione. Bez nich są obcymi, a kompilator nie poręczy za żadnego.

    Dokąd dalej

    Błędy