Типобезопасные токены служб
Используйте типизированные токены, чтобы избежать ошибок разрешения во время выполнения
«Типобезопасные токены служб» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы инверсии управления
- Внедрение через конструктор
- DI-контейнеры с InversifyJS
- Типобезопасные токены служб