Tipos de Acceso Indexado (o tipos de acceso por índice) permiten hacer referencia al tipo de una propiedad específica de un objeto o de cualquier clave a través de la sintaxis T[K]. Es una herramienta poderosa para crear abstracciones flexibles y seguras en términos de tipo.
type Persona = { nombre: string; edad: number; }; type TipoNombre = Persona['nombre']; // string type EdadONombre = Persona['edad' | 'nombre']; // number | string
Se utiliza para escribir tipos y funciones genéricas:
function obtenerPropiedad<T, K extends keyof T>(obj: T, clave: K): T[K] { return obj[clave]; // tipificación correcta del retorno } const usuario = { email: 'a@a.ru', id: 1 }; let id = obtenerPropiedad(usuario, 'id'); // id: number
Persona['salario'] — error en tiempo de compilación.Pregunta: ¿Qué tipo resultará de la expresión type Foo = {a: number, b: string}["a" | "b" | "c"]?
Respuesta: Este ejemplo provocará un error de compilación porque 'c' no es una clave en el tipo al que se accede. TypeScript generará el error:
Type '"c"' does not satisfy the constraint '"a" | "b"'.
Historia
En el proyecto se generaban dinámicamente formularios basados en tipos. Después de agregar un nuevo campo al tipo principal, no se actualizaron los lugares con indexación por claves, como resultado algunos propiedades no se incluían en el formulario, aunque a nivel de tipo se esperaba un mapeo completo. El error se manifestaba solo en tiempo de ejecución, no en la etapa de desarrollo.
Historia
En una biblioteca para validación de datos se utilizó acceso indexado a través de tipos, pero al migrar el código, se trasladó una de las claves del objeto al padre. El antiguo tipo indexado causó un error de compilación, sin embargo, el error ocurrió solo después de la reconstrucción debido a la caché en CI, y anteriormente vivió en staging durante varias semanas.
Historia
Se creía erróneamente que con los Tipos de Acceso Indexado se podía acceder a cualquier clave, incluso si no estaba enumerada explícitamente, lo que llevó a una generación incorrecta de pruebas automáticas para propiedades dinámicas. Como resultado, las pruebas no cubrían parte de los escenarios posibles, ya que el compilador excluía estos casos como no válidos.