Comprender en profundidad el tipo Record de TypeScript

En TypeScript, Record es un tipo genérico integrado muy útil que nos permite definir los tipos de las claves y valores de un objeto. El uso del tipo Record es extremadamente valioso cuando se trabaja con estructuras de datos clave-valor, ya que proporciona un soporte de tipo fuerte para las claves y los valores de los objetos. En este artículo, exploraremos en detalle la definición, el uso y los casos prácticos del tipo Record.

Definición del tipo Record

El tipo Record es un tipo genérico proporcionado por TypeScript que acepta dos parámetros de tipo:

1
Record<Keys, Type>;
  • Keys: El tipo de las claves del objeto, que generalmente es una cadena, un número o un tipo de unión.
  • Type: El tipo de los valores del objeto.

La función del Record es mapear todas las claves de un objeto a un tipo de valor específico. Por ejemplo, si queremos que todas las claves de un objeto sean de tipo cadena y los valores sean de tipo número, podemos usar Record<string, number>.

Escenarios de Uso

El tipo Record es especialmente adecuado para los siguientes escenarios:

  1. Gestión de estructuras de datos clave-valor: Cuando necesitamos crear un objeto con una estructura de pares clave-valor y tenemos requisitos estrictos sobre los tipos de claves y valores, Record es muy útil.
  2. Sustitución de firmas de índice: A diferencia de las firmas de índice, Record puede proporcionar un control más preciso sobre los tipos de claves y valores.
  3. Representación de estructuras de diccionario: Record se puede utilizar para representar estructuras de diccionario con claves fijas.

Ejemplos de Código

Uso Básico

El siguiente ejemplo muestra cómo usar el tipo Record para definir un objeto, donde las claves son cadenas y los valores son números:

1
type Scores = Record<string, number>;
2
3
const studentScores: Scores = {
4
Alice: 85,
5
Bob: 92,
6
Charlie: 78,
7
};
8
9
console.log(studentScores);
10
// Salida: { Alice: 85, Bob: 92, Charlie: 78 }

En este ejemplo, el objeto studentScores tiene claves de tipo cadena y valores de tipo número.

Uso de Tipos de Unión como Claves

También podemos usar tipos de unión para restringir las claves del objeto. Por ejemplo, si queremos que las claves del objeto sean solo cadenas específicas, podemos definirlo así:

1
type Role = "admin" | "user" | "guest";
2
3
type RolePermissions = Record<Role, string[]>;
4
5
const permissions: RolePermissions = {
6
admin: ["create", "edit", "delete"],
7
user: ["view", "edit"],
8
guest: ["view"],
9
};
10
11
console.log(permissions);
12
// Salida: { admin: ['create', 'edit', 'delete'], user: ['view', 'edit'], guest: ['view'] }

En este ejemplo, el tipo RolePermissions asegura que las claves del objeto permissions solo pueden ser 'admin', 'user' o 'guest'.

Combinación con Propiedades Opcionales

Se puede combinar Record con el tipo Partial para hacer que todas las propiedades sean opcionales:

1
type PersonInfo = {
2
name: string;
3
age: number;
4
};
5
6
type PartialPersonInfo = Partial<Record<"Alice" | "Bob", PersonInfo>>;
7
8
const partialInfo: PartialPersonInfo = {
9
Alice: { name: "Alice", age: 30 },
10
// Información de Bob es opcional
11
};
12
13
console.log(partialInfo);
14
// Salida: { Alice: { name: 'Alice', age: 30 } }

En este ejemplo, Partial<Record<'Alice' | 'Bob', PersonInfo>> define un tipo de objeto donde las claves pueden ser 'Alice' o 'Bob' y los valores son del tipo PersonInfo, pero todas las propiedades son opcionales.

Conclusión

El tipo Record de TypeScript es una herramienta poderosa y flexible, adecuada para escenarios que requieren una definición precisa de los tipos de claves y valores de los objetos. No solo simplifica la definición de tipos, sino que también mejora la legibilidad y seguridad del código. Al combinarlo con otras herramientas de tipo, como Partial, Pick y Omit, los desarrolladores pueden manejar estructuras de datos complejas con facilidad, mejorando significativamente la calidad y mantenibilidad del código.