Что такое DSL на уровне типов
Используйте типы, чтобы ограничить плавный API допустимыми программами
«Что такое DSL на уровне типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Что такое DSL на уровне типов
DSL на уровне типов, то есть предметно-ориентированный язык, использует типы TypeScript, чтобы ограничить интерфейс и обеспечить, чтобы только допустимые программы компилировались. Типы выступают в роли грамматики: недопустимые сочетания отклоняются ещё до запуска кода.
Встроенные DSL
Встроенный DSL существует внутри основного языка, здесь — TypeScript, а не в виде отдельного синтаксического анализатора. Вы пишете обычный TS, но система типов обеспечивает соблюдение правил DSL.
Знакомый пример
Вы уже использовали DSL на уровне типов: построитель запросов, разрешающий только допустимые имена столбцов, или маршрутизатор, выводящий параметры из пути. Типы кодируют возможности интерфейса.
Ограничение цепочного интерфейса
Основная идея такова: каждый метод возвращает тип, ограничивающий методы, которые можно вызвать следующими. Вызов методов в неправильном порядке не позволяет выполнить компиляцию.
interface Empty { from(t: string): HasFrom; }
interface HasFrom { where(c: string): HasFrom; select(): string; }
declare const q: Empty;
q.from("users").select(); // ok
q.select(); // Error: select not on EmptyКонечные автоматы в типах
Этот шаблон представляет собой конечный автомат на уровне типов: каждый интерфейс — состояние, а каждый метод — переход в другое состояние. Компилятор проходит по этому автомату, пока Вы объединяете вызовы в цепочку.
Почему бы не ограничиться проверками во время выполнения
Проверки во время выполнения срабатывают поздно — в рабочей среде, когда пользователи уже работают с приложением. DSL на уровне типов срабатывает заранее, в редакторе, показывая красное подчёркивание, ещё до выпуска кода. Правила те же, но обратная связь обходится гораздо дешевле.
Фантомные параметры типов
DSL часто переносят информацию в фантомных параметрах типов: обобщениях, существующих только во время компиляции для отслеживания накопленного состояния, например выбранных столбцов и связанных переменных, без затрат во время выполнения.
interface Query<Selected extends string> {
select<C extends string>(c: C): Query<Selected | C>;
}Литеральные типы в роли токенов
Строковые литеральные типы выступают токенами DSL. В сочетании с шаблонными литералами и объединениями они позволяют системе типов анализировать текстовое содержимое Вашего DSL.
type Direction = "asc" | "desc";
declare function orderBy(col: string, dir: Direction): void;
orderBy("age", "asc"); // ok
orderBy("age", "up"); // Error: not a DirectionОсновные строительные блоки
DSL на уровне типов объединяют обобщения для состояния, условные типы для ветвления, шаблонные литералы для разбора строк и отображаемые типы для преобразования структур. В следующих уроках Вы используете каждый из этих элементов.
Компромиссы
DSL на уровне типов обеспечивают надёжные гарантии, но при чрезмерном использовании могут порождать непонятные ошибки и замедлять компиляцию. Хорошие DSL уравновешивают безопасность и понятность сообщений об ошибках; этому посвящён один из следующих уроков.
Почему это важно
Кодирование правил предметной области в типах превращает компилятор в эксперта по этой области: он автоматически отклоняет бессмысленные конструкции. Так построители запросов, библиотеки форм и системы эффектов обеспечивают столь надёжные гарантии.
Быстрая проверка
Проверьте своё понимание DSL на уровне типов.
Итоги
DSL на уровне типов использует типы TypeScript как грамматику, поэтому компилируются только допустимые программы. Цепочные интерфейсы моделируют конечные автоматы: каждый метод возвращает тип, ограничивающий следующее состояние. Фантомные обобщения, токены на основе литеральных типов, условные, шаблонные и отображаемые типы служат строительными блоками и обеспечивают раннюю обратную связь прямо в редакторе.
Изучай TypeScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 101
- Уроки
- 352
Часто задаваемые вопросы
Урок «Что такое DSL на уровне типов» бесплатный?
Да — полный текст урока «Что такое DSL на уровне типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Что такое DSL на уровне типов»?
Используйте типы, чтобы ограничить плавный API допустимыми программами Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Что такое DSL на уровне типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое DSL на уровне типов
- Проектирование плавного DSL запросов
- Проверка входных данных во время компиляции
- Сообщения об ошибках в DSL на уровне типов