0Pricing
TypeScript Academy · Урок

Проверка входных данных во время компиляции

Отклоняйте некорректные выражения DSL до запуска программы

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

Проверка входных данных во время компиляции

DSL на уровне типов может отклонять некорректные выражения до выполнения кода. С помощью шаблонных литералов и условных типов мы проверяем структуру строки на уровне типов и отклоняем недопустимые входные данные.

Пример: небольшой язык выбора

Представьте, что Вы принимаете строки вроде "user.name" или "order.items.length". Мы хотим отклонять "user." или ".name" во время компиляции.

Разбор с помощью шаблонных литералов

Типы шаблонных литералов разбивают строку на части с помощью infer, что служит основой разбора во время компиляции. Реальный шаблон ограничен обратными кавычками и содержит начало, точку и конец с выводом типа; это сопоставление по разделителю мы обозначаем как DotSplit.

// Real TS: backtick pattern matching Head, ".", Tail.

type Split<S extends string> =
  S extends DotSplit<infer Head, infer Tail>
    ? [Head, ...Split<Tail>]
    : [S];

type P = Split<"a.b.c">; // ["a", "b", "c"]

Проверка каждого сегмента

Условный тип проверяет, что ни один сегмент не пуст. Пустой сегмент делает входные данные недопустимыми. Тот же шаблон DotSplit, в реальном коде являющийся шаблонным литералом в обратных кавычках, управляет рекурсией.

type NonEmpty<S extends string> = S extends "" ? false : true;

type Valid<S extends string> =
  S extends DotSplit<infer H, infer T>
    ? H extends "" ? false : Valid<T>
    : NonEmpty<S>;

type V1 = Valid<"a.b">;  // true
type V2 = Valid<"a.">;   // false

Ограничение API проверкой корректности

Используйте тип корректности, чтобы ограничить параметр функции: строки, прошедшие проверку, сохраняют свой тип, а недопустимые преобразуются в never, поэтому вызов не проходит компиляцию.

declare function path<S extends string>(
  p: Valid<S> extends true ? S : never
): void;

path("user.name"); // ok
path("user.");     // Error: argument is never

Отклонение неизвестных токенов

Можно также ограничить допустимые символы. Сопоставляйте только известные шаблоны сегментов; всё остальное сводится к отклоняющему типу.

type Allowed = "user" | "order" | "name" | "items";
type CheckSeg<S extends string> = S extends Allowed ? true : false;

Проверка операторов

Для DSL выражений, например "age > 18", сопоставьте оператор с помощью шаблонного строкового типа и убедитесь, что он входит в допустимый набор. Сопоставитель (левый пробел O пробел правый) в реальном коде является шаблонным строковым литералом с обратными кавычками; здесь мы обозначаем его как CondMatch.

type Op = ">" | "<" | "=" | ">=" | "<=";

// Real TS: backtick pattern -> left, " ", infer O, " ", right.
type IsCond<S extends string> =
  S extends CondMatch<infer O>
    ? O extends Op ? true : false
    : false;

type C1 = IsCond<"age > 18">; // true
type C2 = IsCond<"age ! 18">; // false

Объединение проверок

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

type And<A, B> = A extends true ? (B extends true ? true : false) : false;

Ограничения рекурсии

Рекурсия на уровне типов имеет ограничения глубины. Для очень длинных строк компилятор может сообщить об ошибке «инстанцирование типа стало чрезмерно глубоким». Ограничивайте длину разбираемых входных данных или упрощайте грамматику.

Лучше разбора во время выполнения

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

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

Многие DSL принимают строковые входные данные: пути, запросы и форматы. Проверка их структуры в системе типов выявляет опечатки и некорректные выражения до запуска программы, превращая целый класс ошибок во время выполнения в ошибки компиляции.

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

Проверьте, насколько хорошо Вы поняли проверку входных данных во время компиляции.

Итоги

Вы проверили входные данные DSL до выполнения, разбирая строковые литералы с помощью шаблонных строковых типов и infer, а затем проверяя сегменты и операторы условными типами. Ограничение параметра функции типом корректности приводит к тому, что некорректные выражения преобразуются в never и не проходят компиляцию; при этом необходимо учитывать ограничения рекурсии.

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

Урок «Проверка входных данных во время компиляции» бесплатный?

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

Чему я научусь в уроке «Проверка входных данных во время компиляции»?

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

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

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

Сколько времени занимает урок «Проверка входных данных во время компиляции»?

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

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

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

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

  1. Что такое DSL на уровне типов
  2. Проектирование плавного DSL запросов
  3. Проверка входных данных во время компиляции
  4. Сообщения об ошибках в DSL на уровне типов
← Назад к TypeScript Academy