Схемы zod/valibot и выведение типов
Проверяйте ненадёжные данные с помощью схем, напрямую выводите типы TS из валидаторов, сравнивайте zod и valibot и подключайте их к обработчикам.
«Схемы zod/valibot и выведение типов» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 1 из 2. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 2 уроков всего.
Введение
Цель: рассматривать внешние данные как неизвестный тип, проверять их по схеме и выводить типы TS из этой схемы. Вы используете zod, познакомитесь с синтаксисом valibot и создадите небольшую вспомогательную функцию для обработчиков.
- Единый источник истины
- safeParse и parse
- Повторное использование выведенных типов
Вывод типов zod
Определите схему один раз. type User = z.infer<typeof userSchema> в точности отражает правила проверки.
import { z } from "zod"
export const userSchema = z.object({
id: z.string().uuid(),
name: z.string().min(1),
age: z.number().int().min(0).optional()
})
export type User = z.infer<typeof userSchema>
// User is kept in sync with runtime rules.Сравнение safeParse и parse
safeParse возвращает результат с признаком успеха или неудачи, не выбрасывая исключение, поэтому отлично подходит для HTTP-обработчиков; parse выбрасывает исключение при недопустимых входных данных.
import type { Request, Response } from "express"
import { userSchema, type User } from "./schema"
export function createUser(req: Request, res: Response<User | { error: string; issues?: unknown }>) {
const r = userSchema.safeParse(req.body)
if (!r.success) {
return res.status(400).json({ error: "Invalid body", issues: r.error.format() })
}
const user = r.data
return res.status(201).json(user)
}
// parse() throws; safeParse() returns a discriminated unionВывод типов valibot
valibot предоставляет компактный инструмент проверки с помощью Infer<typeof schema>. Выберите одну библиотеку и используйте ее единообразно во всей команде.
import { object, string, number, optional, minLength, uuid, minValue } from "valibot"
import type { Infer } from "valibot"
export const VUser = object({
id: string([uuid()]),
name: string([minLength(1)]),
age: optional(number([minValue(0)]))
})
export type VUserT = Infer<typeof VUser>
// Similar idea: one schema, inferred type.Вспомогательная функция проверки
Оберните разбор данных в небольшую вспомогательную функцию, чтобы обработчики получали простую структуру { ok,data } или { ok:false,issues }.
import { ZodTypeAny } from "zod"
export function validate<T extends ZodTypeAny, Out = unknown>(schema: T, value: unknown, onError?: (issues: unknown) => never | void): { ok: true; data: Out } | { ok: false; issues: unknown } {
const r = schema.safeParse(value)
if (!r.success) {
const issues = r.error.format()
if (onError) onError(issues as unknown as never)
return { ok: false, issues }
}
return { ok: true, data: r.data as unknown as Out }
}Советы
Советы:
- Держите схемы рядом с границей системы (HTTP, CLI, операции ввода-вывода с БД).
- Выводите типы и экспортируйте их — избегайте дублирования вручную написанных типов.
- Возвращайте ответ 400 с подробностями о проблемах; никогда не доверяйте входным данным клиента.
Проверка пользы вывода типов
Быстрая проверка: зачем выводить типы из схем?
Итоги
Итоги: проверяйте неизвестные входные данные с помощью zod/valibot, используйте safeParse и выводите типы, чтобы согласовать компиляцию и выполнение.
Часто задаваемые вопросы
Урок «Схемы zod/valibot и выведение типов» бесплатный?
Да — полный текст урока «Схемы zod/valibot и выведение типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 2 уроков всего.
Чему я научусь в уроке «Схемы zod/valibot и выведение типов»?
Проверяйте ненадёжные данные с помощью схем, напрямую выводите типы TS из валидаторов, сравнивайте zod и valibot и подключайте их к обработчикам. Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 2.
Сколько времени занимает урок «Схемы zod/valibot и выведение типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Схемы zod/valibot и выведение типов
- Защитный разбор и оболочки ошибок