0Pricing
TypeScript Academy · Урок

Метаданные декораторов

Добавляйте и считывайте метаданные с помощью API метаданных

«Метаданные декораторов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

API метаданных декораторов

Стандартизированные декораторы включают встроенный канал метаданных. Объект контекста предоставляет объект metadata, в который можно записывать данные, а класс позднее хранит их под известным ключом Symbol.metadata.

context.metadata

Каждый контекст декоратора использует один общий объект metadata для определяемого класса. Декораторы добавляют в него данные; этот объект становится метаданными класса.

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

Считывание через Symbol.metadata

После определения класса собранные метаданные доступны через 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" }

Зачем нужен общий объект

Поскольку все декораторы класса записывают данные в один и тот же объект metadata, Вы можете накапливать сведения от множества декораторов в одной согласованной записи, описывающей класс.

Хранение структурированных метаданных

Значения метаданных могут иметь любую структуру. Распространённый подход — хранить вложенную запись с ключами в виде имён членов.

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

Метаданные уровня класса

Декоратор класса также может записывать метаданные, например имя таблицы, дополняющее сведения о столбцах отдельных полей.

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 = "";
}

Наследование метаданных

Объекты метаданных связаны вдоль цепочки прототипов: объект метаданных подкласса имеет метаданные родительского класса в качестве прототипа, поэтому унаследованные записи видны, если их не переопределить.

Полифилл Symbol.metadata

Symbol.metadata — общеизвестный символ. В окружениях, где его нет, назначьте полифилл, чтобы среда выполнения могла присоединить собранный объект.

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

Метаданные без библиотеки метаданных отражения

Этот API является частью самого предложения о декораторах, поэтому он не требует отдельной библиотеки метаданных отражения. Эта библиотека по-прежнему нужна только для старого экспериментального вывода типов времени разработки (в следующем уроке).

Практический помощник для чтения

Небольшой аксессор централизует чтение метаданных любого класса и возвращает пустой объект, если метаданные отсутствуют.

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

Почему это важно

Метаданные превращают декораторы из разовых обёрток поведения в декларативное описание Ваших классов. Платформы читают это описание, чтобы создавать объектно-реляционные системы, средства проверки и маршрутизаторы без обходных приёмов отражения во время выполнения.

Быстрая проверка

Проверьте своё понимание API метаданных.

Итоги

API метаданных декораторов предоставляет каждому декоратору общий объект context.metadata, доступный через класс посредством Symbol.metadata. Декораторы накапливают структурированные наследуемые метаданные без внешней библиотеки, обеспечивая декларативное описание классов, удобное для платформ.

Часто задаваемые вопросы

Урок «Метаданные декораторов» бесплатный?

Да — полный текст урока «Метаданные декораторов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Метаданные декораторов»?

Добавляйте и считывайте метаданные с помощью API метаданных Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Метаданные декораторов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Объяснение декораторов третьего этапа
  2. Метаданные декораторов
  3. reflect-metadata и типы Design
  4. Создание фреймворка декораторов
← Назад к TypeScript Academy