Детерминированный слой валидации, гарантирующий, что все данные, поступающие в систему, соответствуют определенным архитектурным контрактам.
Преимущества: Zod позволяет объединить рантайм-валидацию с типизацией TypeScript, создавая единый источник истины для форм и данных API.
Располагаются в папке schema. Файлы называются по шаблону [name].schema.ts. Схемы именуются заглавными буквами (напр. ENTITY_SCHEMA).
Располагаются в папке types. Типы, выведенные из схем, именуются с префиксом T (напр. TEntitySchema). Все перечисления полей формы хранятся в объектах ENUM_FORM_....
Создание Zod-объекта с использованием i18nKey для локализации сообщений об ошибках.
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});Использование z.infer для автоматической генерации TypeScript типов из схемы.
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>;Подключение схемы к react-hook-form через zodResolver.
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});