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