No puede usarse para indexar
Type 'K' cannot be used to index type 'T'.Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.
Indexaste un parámetro de tipo con otro parámetro de tipo, y el compilador no tiene motivos para creer que la clave exista.
Reproducción
type Get<T, K> = T[K]La compilación afirma que esto emite exactamente este código.
Por qué lo dice el compilador
Dentro de un genérico, `T` todavía no es un objeto — es la promesa de que llegará uno. `K` no es una clave suya, solo otra incógnita. Pedir `T[K]` es pedirle al compilador que garantice algo sobre dos cosas que nunca ha visto. El arreglo no es un cast: es decirle cómo se relacionan las dos.
Arreglos
- 01
type Get<T, K extends keyof T> = T[K] type Name = Get<{ name: string }, 'name'>
Restringe `K` a `keyof T`. Ahora la relación está escrita, y el compilador puede comprobar cada llamada en vez de fiarse de una.
- 02
type Get<T, K> = K extends keyof T ? T[K] : never type Missing = Get<{ name: string }, 'nope'>
O pregunta en el momento de usarlo en vez de en la puerta. Esto acepta cualquier `K` y responde `never` para claves que no existen — la forma correcta cuando una clave ausente es una respuesta normal y no un error.
Conclusión
Las restricciones son cómo dos parámetros de tipo se presentan el uno al otro. Sin ellas son desconocidos, y el compilador no responderá por ninguno.