0Pricing
TypeScript Academy · Lección

Metadatos de decoradores

Adjunte y lea metadatos mediante la API de metadatos.

Metadatos de decoradores es una lección gratuita de TypeScript Academy en CoddyKit. Esta es la lección 2 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.

La API de metadatos de los decoradores

Los decoradores estandarizados incluyen un canal integrado de metadatos. El objeto de contexto expone un objeto metadata en el que puede escribir, y la clase lo conserva posteriormente bajo la clave conocida Symbol.metadata.

context.metadata

Cada contexto de decorador comparte un único objeto metadata para la clase que se está definiendo. Los decoradores le adjuntan datos; este pasa a ser los metadatos de la clase.

function tag(label: string) {
  return function (value: any, context: DecoratorContext) {
    context.metadata[context.name] = label;
  };
}

Lectura mediante Symbol.metadata

Después de definir la clase, los metadatos recopilados están disponibles en SomeClass[Symbol.metadata].

class User {
  @tag("identifier") id = 0;
  @tag("display")    name = "";
}

const meta = (User as any)[Symbol.metadata];
console.log(meta); // { id: "identifier", name: "display" }

Por qué se usa un objeto compartido

Como todos los decoradores de una clase escriben en el mismo objeto metadata, puede acumular información de muchos decoradores en un único registro coherente que describa la clase.

Almacenamiento de metadatos estructurados

Los valores de los metadatos pueden tener cualquier estructura. Un patrón habitual consiste en mantener un registro anidado cuyas claves son los nombres de los miembros.

function column(type: string) {
  return function (value: any, context: ClassFieldDecoratorContext) {
    const md = context.metadata as any;
    md.columns ??= {};
    md.columns[context.name] = { type };
  };
}

Metadatos a nivel de clase

Un decorador de clase también puede escribir metadatos; por ejemplo, un nombre de tabla que complemente la información de columnas de cada campo.

function entity(table: string) {
  return function (value: Function, context: ClassDecoratorContext) {
    (context.metadata as any).table = table;
  };
}

@entity("users")
class UserEntity {
  @column("serial") id = 0;
  @column("text")   name = "";
}

Herencia de metadatos

Los objetos de metadatos están vinculados a lo largo de la cadena de prototipos: el objeto de metadatos de una subclase tiene como prototipo los metadatos de la clase padre, por lo que las entradas heredadas son visibles salvo que se sobrescriban.

Polyfill de Symbol.metadata

Symbol.metadata es un símbolo bien conocido. En los entornos que no lo incluyen, se asigna un polyfill para que el entorno de ejecución pueda asociar el objeto recopilado.

(Symbol as any).metadata ??= Symbol.for("Symbol.metadata");

Metadatos sin reflect-metadata

Esta API forma parte de la propia propuesta de decoradores, por lo que no requiere la biblioteca independiente reflect-metadata. Esa biblioteca sigue siendo relevante únicamente para la emisión experimental anterior de tipos de diseño (siguiente lección).

Una función auxiliar práctica para leer metadatos

Una pequeña función de acceso centraliza la lectura de metadatos de cualquier clase y devuelve un objeto vacío cuando no existe ninguno.

function getMeta(cls: any): Record<string, any> {
  return (cls[Symbol.metadata] as Record<string, any>) ?? {};
}

Por qué es importante

Los metadatos convierten los decoradores, que dejan de ser simples envoltorios de comportamiento aislados, en una descripción declarativa de sus clases. Los frameworks leen esta descripción para crear ORMs, validadores y enrutadores sin recurrir a trucos de reflexión en tiempo de ejecución.

Comprobación rápida

Compruebe su comprensión de la API de metadatos.

Resumen

La API de metadatos de los decoradores proporciona a cada decorador un objeto compartido context.metadata, expuesto en la clase mediante Symbol.metadata. Los decoradores acumulan metadatos estructurados y heredables sin ninguna biblioteca externa, lo que permite descripciones declarativas de clases compatibles con frameworks.

Preguntas frecuentes

¿La lección «Metadatos de decoradores» es gratis?

Sí — el texto completo de «Metadatos de decoradores» 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 «Metadatos de decoradores»?

Adjunte y lea metadatos mediante la API de metadatos. 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 2 de 4.

¿Cuánto tiempo toma la lección «Metadatos de decoradores»?

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

  1. Explicación de los decoradores de Stage 3
  2. Metadatos de decoradores
  3. reflect-metadata y tipos de diseño
  4. Construcción de un framework de decoradores
← Volver a TypeScript Academy