Platform
    • Naming & Linter Rules
    • Styling Standards
    • Theme
    • Zod & Typing
    • Internationalization
Projects
  • API Connections & Tools
  1. Documentation
  2. Zod & Typing

Валидация и типизация с Zod

Детерминированный слой валидации, гарантирующий, что все данные, поступающие в систему, соответствуют определенным архитектурным контрактам.

Архитектура валидации Zod

Преимущества: Zod позволяет объединить рантайм-валидацию с типизацией TypeScript, создавая единый источник истины для форм и данных API.

Структура схем и типов Zod

Соглашения о наименовании

  • Схемы Zod:

    Располагаются в папке schema. Файлы называются по шаблону [name].schema.ts. Схемы именуются заглавными буквами (напр. ENTITY_SCHEMA).

  • Типы и Интерфейсы:

    Располагаются в папке types. Типы, выведенные из схем, именуются с префиксом T (напр. TEntitySchema). Все перечисления полей формы хранятся в объектах ENUM_FORM_....

01Определение схемы (Schema)

Создание Zod-объекта с использованием i18nKey для локализации сообщений об ошибках.

entities/entity-name/schema/entity-name.schema.ts
1import { z } from "zod"; 2import { type TEntityPageKeys, i18nKey } from "@/shared/config"; 3import { ENUM_FORM_ENTITY } from "../types"; 4 5const msg = i18nKey<TEntityPageKeys>(); 6 7export const ENTITY_SCHEMA = z.object({ 8 [ENUM_FORM_ENTITY.DESCRIPTION]: z 9 .string() 10 .trim() 11 .min(1, { 12 message: msg("form.overview.fields.description.errors.required") 13 }) 14 .min(3, { 15 message: msg("form.overview.fields.description.errors.min") 16 }) 17 .max(5000, { 18 message: msg("form.overview.fields.description.errors.max") 19 }), 20});

02Вывод типов (Types)

Использование z.infer для автоматической генерации TypeScript типов из схемы.

entities/entity-name/types/entity-name.types.ts
1import { z } from "zod"; 2import type { ENTITY_SCHEMA } from "../schema"; 3 4export const ENUM_FORM_ENTITY = { 5 DESCRIPTION: "description", 6} as const; 7 8export type TEntitySchema = z.infer<typeof ENTITY_SCHEMA>;

03Интеграция с формой (Usage)

Подключение схемы к react-hook-form через zodResolver.

widgets/entity-name/ui/entity-name.tsx
1import { useForm } from "react-hook-form"; 2import { zodResolver } from "@hookform/resolvers/zod"; 3import { type TEntitySchema, ENTITY_SCHEMA } from "@/entities/entity-name"; 4 5const form = useForm<TEntitySchema>({ 6 resolver: zodResolver(ENTITY_SCHEMA), 7 mode: "onSubmit" 8});