Firmas de índice frente a Record
Elija entre firmas de índice y el tipo de utilidad Record.
Firmas de índice frente a Record es una lección gratuita de TypeScript Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de TypeScript Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de TypeScript Academy incluye 4 lecciones en total.
Dos formas de tipar un diccionario
TypeScript ofrece dos formas habituales de describir un diccionario: una signatura de índice como { [k: string]: V } y el tipo de utilidad integrado Record<K, V>. Se solapan en gran medida, pero se leen de forma diferente.
El tipo de utilidad Record
Record<K, V> construye un tipo de objeto cuyas claves son K y cuyos valores son V. Cuando se utiliza string como clave, equivale a una signatura de índice de cadenas.
type Scores = Record<string, number>
const game: Scores = { alice: 10, bob: 7 }
console.log(game.alice)Equivalente a una signatura de índice
Estos dos tipos describen la misma forma. Record<string, number> y { [key: string]: number } son intercambiables para claves de tipo string arbitrarias.
type A = Record<string, number>
type B = { [key: string]: number }
const a: A = { x: 1 }
const b: B = a // assignable both ways
console.log(b.x)Record con una unión de claves literales
El verdadero potencial de Record aparece con una unión finita de claves literales. Produce un objeto en el que todas las claves enumeradas son obligatorias, algo que una signatura de índice no puede expresar.
type Role = "admin" | "editor" | "viewer"
type Perms = Record<Role, boolean>
const p: Perms = { admin: true, editor: true, viewer: false }
console.log(p.admin)Las claves ausentes se detectan
Como cada clave literal es obligatoria, olvidar una provoca un error de compilación. Es una garantía sólida que las signaturas de índice sencillamente no pueden ofrecer.
type Role = "admin" | "editor" | "viewer"
// const bad: Record<Role, boolean> = { admin: true, editor: true }
// Error: property viewer is missingLa signatura de índice permite cualquier clave
En cambio, una signatura de índice es abierta. Puede añadir claves que no se hayan mencionado en ningún sitio y no es obligatorio que haya ninguna presente.
type Open = { [key: string]: number }
const o: Open = {} // no keys required
o.anything = 1 // any key allowed
console.log(o.anything)Conjuntos finitos de claves: prefiera Record
Cuando las claves forman un conjunto finito conocido, Record con una unión literal resulta más claro y seguro. Documenta exactamente qué claves existen y exige que el conjunto esté completo.
type Direction = "north" | "south" | "east" | "west"
type Moves = Record<Direction, number>
const m: Moves = { north: 1, south: 0, east: 2, west: 0 }
console.log(m.east)Conjuntos abiertos de claves: ambas opciones sirven
Cuando las claves no tienen límite y se descubren en tiempo de ejecución, tanto Record<string, V> como una signatura de índice funcionan. Muchos equipos eligen Record por brevedad; otros prefieren la signatura por ser más explícita.
type Cache1 = Record<string, string>
type Cache2 = { [url: string]: string }
const c: Cache1 = {}
c["/home"] = "<html>"
console.log(c["/home"])Record es simplemente un tipo mapeado
Internamente, Record<K, V> se define como un tipo mapeado: { [P in K]: V }. Saberlo explica por qué una unión literal produce claves obligatorias, mientras que string produce una signatura de índice.
// lib definition (simplified):
// type Record<K extends string | number | symbol, V> = { [P in K]: V }
type Flags = Record<"a" | "b", boolean>
const f: Flags = { a: true, b: false }
console.log(f.a)Claves con nombre y una captura general
Una signatura de índice puede combinar una captura general con claves fijas en una misma interfaz, lo que resulta útil cuando necesita ambas cosas. Record por sí solo no puede combinar con la misma claridad claves con nombre obligatorias y una captura general abierta.
interface Response {
status: number
[header: string]: number | string
}
const r: Response = { status: 200, "x-id": "abc" }
console.log(r.status)Elección práctica
Regla general: claves finitas y conocidas → Record<Union, V> para comprobar que estén todas. Claves sin límite → cualquiera de las dos formas. ¿Necesita claves con nombre y una captura general? Utilice una signatura de índice dentro de una interfaz.
type Status = "ok" | "error"
type Messages = Record<Status, string>
const msg: Messages = { ok: "done", error: "failed" }
console.log(msg.ok)Comprobación rápida
Compruebe cuánto ha entendido sobre Record y las signaturas de índice.
Resumen
Record<string, V> equivale a una signatura de índice de cadenas, pero Record con una unión de claves literales hace que todas las claves enumeradas sean obligatorias y detecta las ausencias en tiempo de compilación. Utilice Record<Union, V> para claves finitas conocidas, cualquiera de las dos formas para claves sin límite y una signatura de índice cuando necesite claves con nombre junto con una captura general. Internamente, Record es el tipo mapeado { [P in K]: V }.
Preguntas frecuentes
¿La lección «Firmas de índice frente a Record» es gratis?
Sí — el texto completo de «Firmas de índice frente a Record» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de TypeScript Academy, actualiza a CoddyKit PRO. El curso de TypeScript Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Firmas de índice frente a Record»?
Elija entre firmas de índice y el tipo de utilidad Record. Practicas TypeScript Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar TypeScript Academy?
No se requiere experiencia previa. TypeScript Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Firmas de índice frente a Record»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de TypeScript Academy?
Sí. Cada lección de TypeScript Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Definición de firmas de índice
- Firmas de índice de tipo string frente a number
- Combinación de claves conocidas y dinámicas
- Firmas de índice frente a Record