Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
exlends
Категории
  1. Home
  2. Categories
  3. Бекенд, разработка серверов
  4. Zod с .refine() = валидационные правила без лишней возни

Zod с .refine() = валидационные правила без лишней возни

Scheduled Pinned Locked Moved Бекенд, разработка серверов
2 Posts 2 Posters 62 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • kirilljsxK Offline
    kirilljsxK Offline
    kirilljsx
    js
    wrote on last edited by
    #1

    Встречайте! Если кто не знал то Zod — современная TypeScript-first библиотека для валидации данных, сочетающая простоту декларативного синтаксиса с мощными возможностями. Но что делать, когда стандартных проверок недостаточно? На помощь приходит .refine()!

    Просто для сложных правил

    нужно проверить, что пользователь выбрал хотя бы одну опцию подписки. Стандартные валидаторы вроде z.boolean() не умеют работать с взаимосвязями между полями. Остается писать кастомные функции? Не обязательно.

    Решение: .refine()

    Метод .refine() позволяет добавить любое кастомное правило к схеме, сохранив элегантность Zod. Его суть:

    .refine(validator, { message, path })
    
    • validator: функция, возвращающая boolean (или Promise для асинхронной валидации)
    • message: кастомное сообщение об ошибке
    • path: куда привязать ошибку (полезно для форм!)

    Реальный пример:

    export const SubscriptionSchema = z
      .object({
        email: z.string().email(),
        newsletter: z.boolean().optional(),
        promotions: z.boolean().optional(),
        updates: z.boolean().optional(),
      })
      .refine(
        (data) => data.newsletter || data.promotions || data.updates, 
        {
          message: "Выберите хотя бы одну опцию подписки",
          path: ["subscriptionOptions"] // Ошибка привязывается не к полю, а к группе!
        }
      );
    
    • Стандартные правила: email проверяется на корректность, булевы поля опциональны.
    • Кастомное правило: .refine() проверяет, что хотя бы одно из полей newsletter, promotions или updates равно true.
    • При ошибке:
      • Возвращается понятное сообщение
      • Ошибка привязывается к псевдо-полю subscriptionOptions (удобно для отображения в UI!)

    Тестируем:

    const result = SubscriptionSchema.safeParse({
      email: "user@example.com",
      newsletter: false,
      promotions: false,
      updates: false,
    });
    
    console.log(result.success ? "✔ Valid" : "✕ Error:", result.error?.issues[0]?.message);
    // ✕ Error: Выберите хотя бы одну опцию подписки
    

    Почему это круто?

    1. Читаемость: Правила валидации как документация.
    2. Типобезопасность: z.infer<typeof SubscriptionSchema> автоматически генерирует тип:
    type Subscription = {
      email: string;
      newsletter?: boolean;
      promotions?: boolean;
      updates?: boolean;
    }
    
    1. Гибкость: Можно проверять любые условия между полями:
      • “Если выбрана рассылка, телефон обязателен”
      • “Сумма заказа > 1000”
    2. Интеграция с формами: Кастомный path позволяет подсветить ошибку в нужном месте интерфейса.

    С .refine() вы получаете мощь кастомной валидации без boilerplate-кода. Больше никаких велосипедов с ручными проверками после парсинга! Zod позволяет описывать сложные правила в 2-3 строки, сохраняя TypeScript-типы и человекочитаемый синтаксис.

    ✨ Код валидации должен быть таким же чистым, как и код приложения.
    С Zod и .refine() — это реальность.

    1 Reply Last reply
    0
    • JspiJ Offline
      JspiJ Offline
      Jspi
      js
      wrote on last edited by
      #2

      статья про zod и nest js здесь тоже есть примеры использования, и как заменить
      устаревший classvalidator

      1 Reply Last reply
      👍
      1

      Категории

      • Главная
      • Новости
      • Фронтенд
      • Бекенд
      • Языки программирования

      Контакты

      • Сотрудничество
      • info@exlends.com
      • Наш чат
      • Наш ТГ канал

      © 2024 - 2025 ExLends, Inc. Все права защищены.

      Политика конфиденциальности
      • Login

      • Don't have an account? Register

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups