Saltar al contenido

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS2536

    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

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

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

    Adónde ir después

    Errores