0Pricing
TypeScript Academy · Урок

Типобезопасные токены служб

Используйте типизированные токены, чтобы избежать ошибок разрешения во время выполнения

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

Проблема строковых токенов

Строковые токены, такие как "Logger", легко написать с опечаткой, и они не содержат информации о типе. Контейнер не может сообщить Вам, что get("Loggr") неверен, а выведенный тип часто оказывается any.

Символы в качестве токенов

Использование символов вместо строк наделяет каждый токен уникальной идентичностью, поэтому он не может случайно совпасть с другим. Центральный реестр помогает поддерживать их порядок.

const TYPES = {
  Logger: Symbol.for("Logger"),
  Mailer: Symbol.for("Mailer"),
} as const;

Связывание токенов с типами

Главная цель — связать каждый токен с типом, который он разрешает, чтобы контейнер возвращал правильный тип, а не any. Для этого мы создадим типизированную оболочку токена.

interface Token<T> {
  readonly id: symbol;
  readonly _type?: T; // phantom type marker
}

Создание типизированных токенов

Вспомогательная функция создаёт токен, который сохраняет свой тип в фантомном поле. Это поле никогда не содержит значения — оно лишь передаёт информацию о типе компилятору.

function token<T>(name: string): Token<T> {
  return { id: Symbol.for(name) };
}
const LoggerToken = token<Logger>("Logger");

Интерфейс типизированного контейнера

Мы типизируем контейнер так, чтобы get выводил тип возвращаемого значения из токена. Никаких приведений типов и никакого any.

interface TypedContainer {
  get<T>(t: Token<T>): T;
  bind<T>(t: Token<T>, impl: () => T): void;
}

Связывание с выведенными типами

При связывании возвращаемый тип фабрики должен совпадать с типом токена. Несоответствия обнаруживаются во время компиляции.

declare const c: TypedContainer;
c.bind(LoggerToken, () => new ConsoleLogger());
// ConsoleLogger must satisfy Logger or this errors.

Разрешение с полными типами

Теперь get возвращает именно тип токена. Для результата работают автодополнение и проверка типов без ручной аннотации.

const logger = c.get(LoggerToken); // type: Logger
logger.log("typed resolution");

Предотвращение ошибок поиска

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

// c.get(LogerToken) -> compile error: LogerToken is not defined

Аналог в InversifyJS

InversifyJS также поддерживает токены-символы, а вспомогательные средства сообщества добавляют типизированные оболочки. Принцип тот же: связать типизированный токен с реализацией и разрешить его с правильным типом.

import { Container } from "inversify";
const TYPES = { Logger: Symbol.for("Logger") };
// container.bind<Logger>(TYPES.Logger).to(ConsoleLogger)

Реестр токенов

Централизация токенов в одном модуле создаёт единый источник истины, поэтому их легко находить и реорганизовывать, а также поддерживать согласованность во всей кодовой базе.

export const TOKENS = {
  Logger: token<Logger>("Logger"),
  Mailer: token<Mailer>("Mailer"),
};

Краткое изложение преимуществ

Типизированные токены обеспечивают уникальную идентичность (символы), безопасность во время компиляции (несоответствия отклоняются), правильные выведенные типы (без any) и защиту от опечаток (ошибки неопределённых переменных).

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

Краткая проверка по этому уроку.

Итоги

Типобезопасные сервисные токены оборачивают уникальный symbol фантомным типом, связывая каждый токен с типом, который он разрешает. get возвращает точный тип, связывание требует соответствующих реализаций, а опечатки превращаются в ошибки компиляции вместо незаметных ошибок поиска по строке.

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

Урок «Типобезопасные токены служб» бесплатный?

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

Чему я научусь в уроке «Типобезопасные токены служб»?

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

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

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

Сколько времени занимает урок «Типобезопасные токены служб»?

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

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

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

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

  1. Основы инверсии управления
  2. Внедрение через конструктор
  3. DI-контейнеры с InversifyJS
  4. Типобезопасные токены служб
← Назад к TypeScript Academy