ФронтендБэкендTypeScriptJavaScript

Zod 4 + TypeScript: проверяем форму и JSON из API без неожиданных ошибок

Создаём схему Zod 4 для формы и ответа API, используем safeParse, показываем ошибки полей и получаем проверенный TypeScript-тип.

Кодик

Автор

6 мин чтения

Zod 4 можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Zod проверяет неизвестные данные во время выполнения и одновременно выводит TypeScript-тип из одной схемы. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

Аннотация as User успокаивает редактор, но не меняет JSON из сети: поле age всё ещё может оказаться строкой или исчезнуть. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте схему регистрации, функцию разбора FormData и безопасную проверку неизвестного JSON от API. Проверка: корректная форма получает типизированные данные, неверные email и age дают ошибки полей, а сломанный ответ API не проходит дальше.

1Соберите минимум

описать email, displayName и age с ограничениями. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

числовая строка явно превращается в number. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте поле role как enum и отдельную ошибку для неизвестного значения из API. Так копирование станет практикой.

Как устроен учебный проект Zod 4

Неизвестные данные входят как unknown, schema.safeParse разделяет success и error, а бизнес-функция получает только проверенный тип. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.

ЭтапДействиеПроверяемый результат
Схемаописать email, displayName и age с ограничениямиz.infer создаёт TypeScript-тип без дублирования
Формапреобразовать FormData в простой объектчисловая строка явно превращается в number
Проверкавызвать safeParse и разобрать результатошибки привязаны к конкретным путям полей
APIпроверить await response.json как unknownнесовместимый JSON не попадает в UI

Контрольные точки: схема, форма, проверка и api. Следующий шаг начинается после совпадения с ожидаемым результатом.

Путь данных в проекте Zod 4
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех Начните с unknown, а не с as User. Тогда TypeScript заставит пройти через схему перед использованием полей. Сохраните команду запуска и ожидаемый вывод.

Собираем рабочий пример шаг за шагом

Пример сверялся с актуальной документацией официальной документации Zod 4 на 19 октября 2026 года. Создайте TypeScript-проект и установите zod. Включите strict в tsconfig и добавьте небольшой файл проверки без UI. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.

import * as z from 'zod'

const Registration = z.object({
  email: z.string().trim().email('Введите корректный email'),
  displayName: z.string().trim().min(2, 'Минимум 2 символа').max(40),
  age: z.coerce.number().int().min(14, 'Минимальный возраст 14').max(120),
})

type Registration = z.infer<typeof Registration>

function parseRegistration(input: unknown): Registration | null {
  const result = Registration.safeParse(input)
  if (!result.success) {
    console.table(result.error.issues.map((issue) => ({
      field: issue.path.join('.'),
      message: issue.message,
    })))
    return null
  }
  return result.data
}

console.log(parseRegistration({
  email: ' student@example.com ',
  displayName: 'Кодик',
  age: '18',
}))
Что должно произойти после запуска
  • Пробелы у строк удаляются, а возраст "18" превращается в число 18.
  • Неверные данные возвращают список issues с путём поля и не попадают в типизированную бизнес-логику.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

safeParse не бросает исключение для обычной ошибки пользователя, а возвращает discriminated union по полю success. Найдите в примере вход, проверку и место формирования результата.

Хрупкий и проверяемый вариант Zod 4
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

Схема является runtime-объектом. TypeScript-тип z.infer существует только при разработке, а Zod реально проверяет значение в браузере или Node.js. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Coercion удобен для FormData, но может принимать больше входов, чем вы ожидаете. Перед применением определите допустимые представления и добавьте тесты для пустой строки.

ЧастьЗа что отвечаетЧто проверить
Schemaзадаёт форму, преобразования и ограничениякаждое поле имеет понятное сообщение
safeParseвозвращает успех с data или ошибку с issuesобычный неверный ввод не требует try/catch
z.inferполучает статический тип из схемысхема и интерфейс не расходятся

Не превращайте каждую внутреннюю переменную в Zod-схему. Валидация нужна на границах доверия: форма, URL, localStorage, сеть, переменные окружения. Внутри проверенной функции используйте обычные TypeScript-типы. Это сохраняет ясность и не добавляет лишнюю работу. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Передайте age: "", age: "abc" и age: "13". Зафиксируйте, какие issues возвращает каждая ветка. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

Подключите схему к HTML-форме и выведите первое сообщение рядом с соответствующим input через issue.path. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.

Проверка своими руками
  1. Сохраните ожидаемый результат: корректная форма получает типизированные данные, неверные email и age дают ошибки полей, а сломанный ответ API не проходит дальше.
  2. Измените правило: добавьте поле role как enum и отдельную ошибку для неизвестного значения из API. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • z.infer создаёт TypeScript-тип без дублирования
  • числовая строка явно превращается в number
  • ошибки привязаны к конкретным путям полей
  • несовместимый JSON не попадает в UI

Схема полезна, когда ошибка превращается в понятное решение: подсветить поле, остановить запрос или записать диагностику ответа API. Полезная правка проходит от нового ввода до видимого результата.

Четыре контрольные точки Zod 4
Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.

Что запомнить и куда двигаться дальше

Следующий шаг - разделить форму создания и ответ API, если у них разные поля. Не расширяйте одну схему до огромного универсального объекта. Для закрепления откройте в первом проекте TypeScript, в проверке JSON через Pydantic и в REST API на Bun.

Как изучить тему в Кодике

Повторите unknown, union, generics и обработку формы, затем подключайте Zod на внешней границе. Сначала восстановите главную функцию и проверьте её на трёх значениях.

ШагЧто разобратьМини-проверка
1. ОсноваTypeScript unknown, narrowing и типы объектовОбъясните вход и выход функции.
2. Инструментz.object, строки, числа, coerce и safeParseПовторите команду по памяти.
3. ПроектОшибки формы и проверку response.jsonПроверьте два сценария.
4. РефакторингКомпозицию схем, тесты и разделение контрактовРазделите ввод, логику и вывод.

Уберите as из одного старого API-вызова и замените его явной проверкой unknown через схему. Базовый синтаксис закрепите через курс JavaScript.

Type assertion вместо проверки

as User ничего не проверяет во время выполнения. Начинайте с unknown.

parse для ошибок формы

Исключение усложняет обычный пользовательский сценарий. Используйте safeParse.

Бесконтрольный coerce

Пустая строка или неожиданный тип может преобразоваться не так, как задумано. Добавьте граничные тесты.

Одна схема на всё

Форма, БД и API расходятся по требованиям. Составляйте отдельные схемы из общих частей.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальной документации Zod 4. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Zod 4 + TypeScript: проверяем форму и JSON из API без неожиданных ошибок
Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.

Короткие ответы
Чем safeParse отличается от parse?

safeParse возвращает объект success/error, а parse бросает исключение при неверных данных.

Зачем начинать JSON с unknown?

Unknown запрещает использовать поля до реальной проверки и не создаёт ложной уверенности.

Что проверять первым, если Zod 4 не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект Zod 4 работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

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

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс JavaScript, затем восстановите ключевую функцию без подсказки.