Определение схем¶
Для проверки данных необходимо сначала определить схему. Схемы представляют типы, от простых примитивных значений до сложных вложенных объектов и массивов.
Примитивы¶
1 2 3 4 5 6 7 8 9 10 |
|
Принудительное преобразование¶
Чтобы принудительно преобразовать входные данные в соответствующий тип, используйте вместо этого z.coerce
:
1 2 3 4 |
|
Принудительный вариант этих схем пытается преобразовать входное значение в соответствующий тип.
1 2 3 4 5 6 |
|
Как работает принуждение в Zod
Zod принудительно обрабатывает все входные данные с помощью встроенных конструкторов.
Zod API | Приведение |
---|---|
z.coerce.string() | String(value) |
z.coerce.number() | Number(value) |
z.coerce.boolean() | Boolean(value) |
z.coerce.bigint() | BigInt(value) |
z.coerce.date() | new Date(value) |
Булевое принудительное преобразование с помощью z.coerce.boolean()
может работать не так, как вы ожидаете. Любое истинное значение принудительно преобразуется в true
, а любое ложное значение принудительно преобразуется в false
.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Для полного контроля над логикой принуждения рассмотрите возможность использования z.transform()
или z.pipe()
.
Литералы¶
Литеральные схемы представляют собой литеральный тип, например "hello world"
или "5"
.
1 2 3 4 |
|
Для представления литералов JavaScript null
и undefined
:
1 2 3 |
|
Чтобы разрешить несколько литеральных значений:
1 2 3 4 |
|
Чтобы извлечь набор допустимых значений из литеральной схемы:
1 |
|
Строки¶
Zod предоставляет несколько встроенных API для проверки и преобразования строк. Для выполнения некоторых распространенных проверок строк:
1 2 3 4 5 6 7 8 9 |
|
Чтобы выполнить несколько простых преобразований строк:
1 2 3 |
|
Форматы строк¶
Для проверки на соответствие некоторым распространенным форматам строк:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Электронные адреса¶
Для проверки адресов электронной почты:
1 |
|
По умолчанию Zod использует сравнительно строгое регулярное выражение для проверки нормальных адресов электронной почты, содержащих общие символы. Оно примерно соответствует правилам, применяемым Gmail. Чтобы узнать больше об этом регулярном выражении, обратитесь к этой публикации.
1 |
|
Чтобы настроить поведение проверки электронной почты, вы можете передать пользовательское регулярное выражение в параметр pattern
.
1 |
|
Zod экспортирует несколько полезных регулярных выражений, которые вы можете использовать.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
UUIDs¶
Для проверки UUID:
1 |
|
Чтобы указать конкретную версию UUID:
1 2 3 4 5 6 7 |
|
Спецификация UUID RFC 9562/4122 требует, чтобы первые два бита байта 8 были равны 10
. Другие идентификаторы, подобные UUID, не налагают этого ограничения. Для проверки любого идентификатора, подобного UUID:
1 |
|
URLs¶
Для проверки любого URL-адреса, совместимого с WHATWG:
1 2 3 4 5 6 |
|
Как видите, это довольно допустимо. Внутренне для проверки входных данных используется конструктор new URL()
; это поведение может отличаться на разных платформах и в разных средах выполнения, но это наиболее строгий способ проверки URI/URL в любой среде выполнения/движке JS.
Чтобы проверить имя хоста по определенному регулярному выражению:
1 2 3 4 |
|
Чтобы проверить протокол на соответствие определенному регулярному выражению, используйте параметр protocol
.
1 2 3 4 |
|
Веб-URL — во многих случаях вам потребуется проверить именно веб-URL. Вот рекомендуемая схема для этого:
1 2 3 4 |
|
Это ограничивает протокол http
/https
и гарантирует, что имя хоста является действительным доменным именем с помощью регулярного выражения z.regexes.domain
:
1 |
|
Даты и время ISO¶
Как вы, возможно, заметили, строка Zod включает в себя несколько проверок, связанных с датой и временем. Эти проверки основаны на регулярных выражениях, поэтому они не так строги, как полная библиотека даты и времени. Однако они очень удобны для проверки ввода пользователя.
Метод z.iso.datetime()
обеспечивает соблюдение стандарта ISO 8601; по умолчанию смещения часовых поясов не допускаются:
1 2 3 4 5 6 7 |
|
Чтобы использовать смещение часовых поясов:
1 2 3 4 5 6 7 8 9 10 11 |
|
Чтобы позволить использование неквалифицированных (без указания часового пояса) дат и времени:
1 2 3 |
|
Ограничить допустимое время precision
. По умолчанию секунды не являются обязательными, и допускается произвольная точность до долей секунды.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Даты ISO¶
Метод z.iso.date()
проверяет строки в формате YYYY-MM-DD
.
1 2 3 4 5 |
|
Время ISO¶
Метод z.iso.time()
проверяет строки в формате HH:MM[:SS[.s+]]
. По умолчанию секунды являются необязательными, как и десятичные доли секунды.
1 2 3 4 5 |
|
Никакие смещения не допускаются.
1 2 |
|
Используйте параметр precision
для ограничения допустимой десятичной точности.
1 2 3 4 5 |
|
IP адреса¶
1 2 3 4 5 |
|
IP блоки (CIDR)¶
Проверьте диапазоны IP-адресов, указанные с помощью нотации CIDR.
1 2 3 4 5 |
|
Шаблонные литералы¶
Новое в Zod 4
Чтобы определить схему шаблонного литерала:
1 2 3 4 5 6 |
|
API z.templateLiteral
может обрабатывать любое количество строковых литералов (например, "hello"
) и схем. Можно передавать любую схему с выведенным типом, который можно присвоить string | number | bigint | boolean | null | undefined
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Числа¶
Используйте z.number()
для проверки чисел. Допускаются любые конечные числа.
1 2 3 4 5 |
|
Zod реализует несколько проверок, связанных с числами:
1 2 3 4 5 6 7 8 9 |
|
Если (по какой-то причине) вы хотите проверить NaN
, используйте z.nan()
.
1 2 |
|
Целые числа¶
Для проверки целых чисел:
1 2 |
|
BigInt¶
Для проверки BigInt:
1 |
|
Zod включает в себя несколько проверок, специфичных для BigInt.
1 2 3 4 5 6 7 8 9 |
|
Логические значения¶
Для проверки логических значений:
1 2 |
|
Даты¶
Используйте z.date()
для проверки экземпляров Date
.
1 2 |
|
Чтобы настроить сообщение об ошибке:
1 2 3 4 5 6 |
|
Zod предоставляет несколько проверок, связанных с конкретными датами.
1 2 |
|
Enums¶
Используйте z.enum
для проверки вводимых данных на соответствие фиксированному набору допустимых строковых значений.
1 2 3 4 |
|
Внимание
Если вы объявите массив строк как переменную, Zod не сможет правильно определить точные значения каждого элемента.
1 2 3 4 |
|
Чтобы исправить это, всегда передавайте массив непосредственно в функцию z.enum()
или используйте as const
.
1 2 3 4 |
|
Вы также можете передать внешне объявленный TypeScript enum.
Zod 4
Заменяет API z.nativeEnum()
в Zod 3.
Обратите внимание, что использование ключевого слова enum
в TypeScript не рекомендуется.
1 2 3 4 5 6 7 |
|
.enum
¶
Чтобы извлечь значения схемы в виде объекта, похожего на перечисление:
1 2 3 4 |
|
.exclude()
¶
Чтобы создать новую схему перечисления, исключив определенные значения:
1 2 |
|
.extract()
¶
Чтобы создать новую схему перечисления, извлекая определенные значения:
1 2 3 4 5 |
|
Stringbools¶
💎 Новое в Zod 4
В некоторых случаях (например, при разборе переменных окружения) полезно преобразовать определенные строковые «булевы» значения в простые значения boolean
. Для этого в Zod 4 введена функция z.stringbool()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Чтобы настроить значения truthy
и falsy
:
1 2 3 4 5 |
|
По умолчанию схема нечувствительна к регистру; все вводимые данные преобразуются в нижний регистр перед сравнением со значениями truthy
/falsy
. Чтобы сделать схему чувствительной к регистру:
1 2 3 |
|
Опциональные¶
Чтобы сделать схему опциональной (то есть разрешить ввод undefined
).
1 |
|
Это возвращает экземпляр ZodOptional
, который оборачивает исходную схему. Чтобы извлечь внутреннюю схему:
1 |
|
Nullables¶
Чтобы сделать схему nullable (то есть разрешить ввод значений null
).
1 |
|
Это возвращает экземпляр ZodNullable
, который оборачивает исходную схему. Чтобы извлечь внутреннюю схему:
1 |
|
Nullish¶
Чтобы сделать схему nullish (как опциональной, так и допускающей нулевые значения):
1 |
|
Более подробную информацию о концепции nullish см. в руководстве по TypeScript.
Unknown¶
Zod стремится полностью повторить систему типов TypeScript. Таким образом, Zod предоставляет API для представления следующих специальных типов:
1 2 3 |
|
Never¶
Ни одно значение не пройдет проверку.
1 |
|
Объекты¶
Чтобы определить тип объекта:
1 2 3 4 5 6 7 8 |
|
По умолчанию все свойства являются обязательными. Чтобы сделать некоторые свойства необязательными:
1 2 3 4 5 6 |
|
По умолчанию, нераспознанные ключи удаляются из результата анализа:
1 2 |
|
z.strictObject
¶
Чтобы определить строгую схему, которая выдает ошибку при обнаружении неизвестных ключей:
1 2 3 4 5 6 |
|
z.looseObject
¶
Чтобы определить гибкую схему, которая пропускает неизвестные ключи:
1 2 3 4 5 6 |
|
.catchall()
¶
Чтобы определить универсальную схему, которая будет использоваться для проверки любых нераспознанных ключей:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
.shape
¶
Для доступа к внутренним схемам:
1 2 |
|
.keyof()
¶
Чтобы создать схему ZodEnum
из ключей схемы объекта:
1 2 |
|
.extend()
¶
Чтобы добавить дополнительные поля в схему объекта:
1 2 3 |
|
Этот API можно использовать для перезаписи существующих полей! Будьте осторожны с этой функцией! Если две схемы имеют общие ключи, B перезапишет A.
Альтернатива: деструктуризация
Вы также можете полностью избежать использования .extend()
, создав совершенно новую схему объекта. Это сделает уровень строгости результирующей схемы визуально очевидным.
1 2 3 4 5 |
|
Вы также можете использовать эту функцию для объединения нескольких объектов за один раз.
1 2 3 4 5 |
|
Этот подход имеет несколько преимуществ:
- Он использует функции на уровне языка (синтаксис деструктуризации) вместо библиотечных API.
- Один и тот же синтаксис работает в Zod и Zod Mini
- Он более эффективен для
tsc
— метод.extend()
может быть дорогостоящим для больших схем, а из-за ограничения TypeScript его стоимость возрастает в квадратичной зависимости при цепочке вызовов - При желании вы можете изменить уровень строгости результирующей схемы с помощью
z.strictObject()
илиz.looseObject()
.pick()
¶
Вдохновленный встроенными типами утилит Pick
и Omit
в TypeScript, Zod предоставляет специальные API для выбора и исключения определенных ключей из схемы объекта.
Начнем с этой начальной схемы:
1 2 3 4 5 6 |
|
Чтобы выбрать определенные ключи:
1 |
|
.omit()
¶
Чтобы пропустить определенные ключи:
1 |
|
.partial()
¶
Для удобства Zod предоставляет специальный API для того, чтобы сделать некоторые или все свойства опциональными, вдохновленный встроенным типом утилиты TypeScript Partial
.
Чтобы сделать все поля опциональными:
1 2 |
|
Чтобы сделать определенные свойства необязательными:
1 2 3 4 |
|
.required()
¶
Zod предоставляет API для того, чтобы сделать некоторые или все свойства обязательными, вдохновленный типом утилиты TypeScript Required
.
Чтобы сделать все свойства обязательными:
1 2 |
|
Чтобы сделать определенные свойства обязательными:
1 2 3 4 |
|
Рекурсивные объекты¶
Чтобы определить самореференциальный тип, используйте геттер для ключа. Это позволяет JavaScript разрешить циклическую схему во время выполнения.
1 2 3 4 5 6 7 8 9 |
|
Хотя рекурсивные схемы поддерживаются, передача циклических данных в Zod приведет к бесконечному циклу.
Вы также можете представлять взаимно рекурсивные типы:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Все API объектов (.pick()
, .omit()
, .required()
, .partial()
и т. д.) работают так, как и ожидается.
Ошибки цикличности¶
Из-за ограничений TypeScript рекурсивный вывод типов может быть привередливым и работает только в определенных сценариях. Некоторые более сложные типы могут вызывать рекурсивные ошибки типов, подобные этой:
1 2 3 4 5 6 7 8 9 10 |
|
В таких случаях ошибку можно устранить с помощью аннотации типа для проблемного геттера:
1 2 3 4 5 6 7 8 |
|
Массивы¶
Чтобы определить схему массива:
1 |
|
Для доступа к внутренней схеме элемента массива.
1 |
|
Zod реализует ряд проверок, специфичных для массивов:
1 2 3 |
|
Кортежи¶
В отличие от массивов, кортежи обычно представляют собой массивы фиксированной длины, которые задают разные схемы для каждого индекса.
1 2 3 4 5 6 7 8 |
|
Чтобы добавить вариативный («остаточный») аргумент:
1 2 |
|
Объединения¶
Типы объединений (A | B
) представляют собой логическое «ИЛИ». Схемы объединений Zod проверяют входные данные по порядку для каждого варианта. Возвращается первое значение, которое прошло проверку.
1 2 3 4 5 |
|
Чтобы извлечь внутренние варианты схем:
1 |
|
Дискриминированные объединения¶
Дискриминированное объединение — это особый вид объединения, в котором а) все варианты являются схемами объектов, которые б) имеют общий ключ («дискриминатор»). На основе значения ключа дискриминатора TypeScript может «сузить» сигнатуру типа, как и ожидается.
1 2 3 4 5 6 7 8 9 10 11 |
|
Вы можете представить это с помощью обычного z.union()
. Но обычные объединения являются наивными — они проверяют входные данные по порядку для каждого варианта и возвращают первый, который проходит проверку. Это может быть медленно для больших объединений.
Поэтому Zod предоставляет API z.discriminatedUnion()
, который использует ключ дискриминатора для более эффективного разбора.
1 2 3 4 5 6 7 8 9 10 |
|
Вложенные дискриминированные объединения
Для сложных случаев использования дискриминируемые объединения могут быть вложенными. Zod определит оптимальную стратегию разбора, чтобы использовать дискриминаторы на каждом уровне.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Пересечения¶
Типы пересечений (A & B
) представляют собой логическое «И».
1 2 3 4 5 |
|
Это может быть полезно для пересечения двух типов объектов.
1 2 3 4 5 6 7 8 9 |
|
При объединении схем объектов предпочтительнее использовать A.extend(B)
, а не пересечения. Использование .extend()
даст вам новую схему объекта, тогда как z.intersection(A, B)
возвращает экземпляр ZodIntersection
, в котором отсутствуют общие методы объектов, такие как pick
и omit
.
Record¶
Схемы записей используются для проверки типов, таких как Record<string, number>
.
1 2 3 4 5 6 7 |
|
Ключевая схема может быть любой схемой Zod, которая может быть присвоена string | number | symbol
.
1 2 3 |
|
Чтобы создать схемы объектов, содержащие ключи, определенные перечислением:
1 2 3 |
|
Zod 4
В Zod 4, если вы передадите z.enum
в качестве первого аргумента в z.record()
, Zod тщательно проверит, что все значения перечисления присутствуют во входных данных в качестве ключей. Это поведение соответствует TypeScript:
1 2 3 |
|
В Zod 3 исчерпываемость не проверялась. Чтобы воспроизвести прежнее поведение, используйте z.partialRecord()
.
Если вам нужен тип записи partial, используйте z.partialRecord()
. Это позволяет пропустить специальные проверки полноты, которые Zod обычно выполняет с ключевыми схемами z.enum()
и z.literal()
.
1 2 3 |
|
Примечание о числовых ключах
Хотя TypeScript позволяет определять типы Record
с ключами number
(например, Record<number, unknown>
), числовые ключи на самом деле не существуют в JavaScript, который преобразует все ключи в строки.
1 2 3 4 |
|
Как видите, JavaScript автоматически преобразует все числовые ключи в строки. Таким образом, использование z.number()
в качестве схемы ключа внутри z.record()
всегда будет вызывать ошибку при разборе, но Zod допускает это для обеспечения совместимости с системой типов TypeScript.
Map¶
1 2 3 4 5 6 7 8 |
|
Set¶
1 2 3 4 5 6 7 |
|
Схемы наборов могут быть дополнительно ограничены с помощью следующих служебных методов.
1 2 3 |
|
Файлы¶
Для проверки экземпляров File
:
1 2 3 4 5 6 |
|
Промисы¶
Устарело
z.promise()
устарело в Zod 4. Существует крайне мало действительных случаев использования схемы Promise
. Если вы подозреваете, что значение может быть Promise
, просто await
его перед разбором с помощью Zod.
См. документацию по z.promise()
1 |
|
«Парсинг» работает немного по-другому с промисами схем. Проверка происходит в два этапа:
- Zod синхронно проверяет, что входные данные являются экземпляром Promise (т. е. объектом с методами
.then
и.catch
). - Zod использует
.then
, чтобы добавить дополнительный шаг проверки к существующему Promise. Вам нужно будет использовать.catch
на возвращенном Promise, чтобы обработать ошибки проверки.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Instanceof¶
Вы можете использовать z.instanceof
, чтобы проверить, является ли ввод экземпляром класса. Это полезно для проверки ввода по отношению к классам, экспортированным из сторонних библиотек.
1 2 3 4 5 6 7 8 |
|
Уточнения¶
Каждая схема Zod хранит массив уточнений. Уточнения — это способ выполнения настраиваемой проверки, для которой Zod не предоставляет собственного API.
.refine()
¶
1 2 3 |
|
Функции усовершенствования никогда не должны вызывать исключения. Вместо этого они должны возвращать ложное значение, чтобы сигнализировать об ошибке. Вызванные ошибки не перехватываются Zod.
error
¶
Чтобы настроить сообщение об ошибке:
1 2 3 4 5 |
|
abort
¶
По умолчанию проблемы валидации, выявленные в ходе проверок, считаются продолжаемыми; то есть Zod выполнит все проверки по порядку, даже если одна из них вызовет ошибку валидации. Обычно это желательно, поскольку Zod может выявить как можно больше ошибок за один раз.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Чтобы пометить конкретное уточнение как непродолжаемое, используйте параметр abort
. Проверка будет прервана, если проверка не пройдет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
path
¶
Чтобы настроить путь ошибки, используйте параметр path
. Обычно это полезно только в контексте схем объектов.
1 2 3 4 5 6 7 8 9 |
|
Это установит параметр path
в связанной проблеме:
1 2 3 4 5 6 7 8 9 10 |
|
Чтобы определить асинхронное уточнение, просто передайте функцию async
:
1 2 3 4 |
|
Если вы используете асинхронные уточнения, вы должны использовать метод .parseAsync
для анализа данных! В противном случае Zod выдаст ошибку.
1 |
|
when
¶
Примечание
Это функция для опытных пользователей, которая может быть использована не по назначению, что увеличит вероятность возникновения невыявленных ошибок, происходящих изнутри ваших уточнений.
По умолчанию уточнения не запускаются, если уже были обнаружены какие-либо непрерывные проблемы. Zod тщательно проверяет правильность сигнатуры типа значения, прежде чем передавать его в какие-либо функции уточнения.
1 2 3 4 5 |
|
В некоторых случаях требуется более точный контроль над временем выполнения уточнений. Рассмотрим, например, проверку «подтверждение пароля»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Ошибка в anotherField
помешает выполнению проверки подтверждения пароля, даже если эта проверка не зависит от anotherField
. Чтобы контролировать, когда будет выполняться уточнение, используйте параметр when
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
.superRefine()
¶
В Zod 4 функция .superRefine()
была признана устаревшей и заменена на .check()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
.check()
¶
API .refine()
является синтаксическим сахаром поверх более универсального (и многословного) API под названием .check()
. Вы можете использовать этот API для создания нескольких проблем в одном уточнении или для полного контроля над сгенерированными объектами проблем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Обычный API .refine
генерирует только проблемы с кодом ошибки "custom"
, но .check()
позволяет выбрасывать другие типы проблем. Для получения дополнительной информации о внутренних типах проблем Zod, прочтите документацию Настройка ошибок.
Пайпы¶
Схемы можно объединять в «пайпы». Пайпы в основном полезны при использовании в сочетании с трансформациями.
1 2 3 4 5 |
|
Трансформации¶
Трансформации — это особый вид схем. Вместо проверки вводимых данных они принимают любые данные и выполняют над ними определенные преобразования. Чтобы определить трансформацию:
1 2 3 4 5 |
|
Чтобы выполнить логику валидации внутри преобразования, используйте ctx
. Чтобы сообщить о проблеме валидации, добавьте новую проблему в ctx.issues
(аналогично API .check()
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Чаще всего преобразования используются в сочетании с пайпами. Такое сочетание полезно для выполнения некоторой первоначальной проверки, а затем преобразования проанализированных данных в другую форму.
1 2 3 4 5 |
|
.transform()
¶
Передача схемы в трансформацию является распространенным паттерном, поэтому Zod предоставляет удобный метод .transform()
.
1 2 3 |
|
Трансформации также могут быть асинхронными:
1 2 3 4 5 6 |
|
Если вы используете асинхронные трансформации, при разборе данных необходимо использовать .parseAsync
или .safeParseAsync
! В противном случае Zod выдаст ошибку.
.preprocess()
¶
Передача преобразования в другую схему — еще один распространенный паттерн, поэтому Zod предоставляет удобную функцию z.preprocess()
.
1 2 3 4 5 6 |
|
Настройки по умолчанию¶
Чтобы установить значение по умолчанию для схемы:
1 2 3 |
|
В качестве альтернативы можно передать функцию, которая будет повторно выполняться всякий раз, когда необходимо сгенерировать значение по умолчанию:
1 2 3 4 5 |
|
Предустановленные значения¶
В Zod установка предустановленного значения приводит к прерыванию процесса разбора. Если входные данные имеют значение undefined
, то предустановленное значение возвращается немедленно. Таким образом, предустановленное значение должно быть присвоимым типу вывода схемы.
1 2 3 4 5 |
|
Иногда полезно определить значение prefault («предустановленное значение по умолчанию»). Если входные данные имеют значение undefined
, вместо них будет проанализировано значение prefault
. Процесс анализа не прерывается. Таким образом, значение prefault должно быть присвоимым типу входных данных схемы.
1 2 3 4 |
|
Это также полезно, если вы хотите передать некоторое входное значение через некоторые изменяющиеся уточнения.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Catch¶
Используйте .catch()
, чтобы определить запасное значение, которое будет возвращено в случае ошибки проверки:
1 2 3 4 |
|
В качестве альтернативы можно передать функцию, которая будет повторно выполняться всякий раз, когда необходимо сгенерировать значение catch.
1 2 3 4 5 6 7 8 |
|
Брендированные типы¶
Система типов TypeScript является структурной, что означает, что два типа, которые являются структурно эквивалентными, считаются одинаковыми.
1 2 3 4 5 |
|
В некоторых случаях может быть желательным имитировать номинальное типирование внутри TypeScript. Это можно сделать с помощью брендированных типов (также известных как «непрозрачные типы»).
1 2 3 4 5 6 7 8 |
|
Под капотом это работает путем привязки «бренда» к выведенному типу схемы.
1 2 |
|
С этим брендом любые простые (без бренда) структуры данных больше не могут быть присвоены выведенному типу. Чтобы получить брендированные данные, необходимо проанализировать некоторые данные с помощью схемы.
Обратите внимание, что брендированные типы не влияют на результат выполнения
.parse
. Это только статическая конструкция.
Readonly¶
Чтобы пометить схему как доступную только для чтения:
1 2 3 4 5 |
|
Выведенный тип новых схем будет помечен как readonly
. Обратите внимание, что в TypeScript это влияет только на объекты, массивы, кортежи, Set
и Map
:
1 2 3 4 5 |
|
Входные данные будут анализироваться как обычно, затем результат будет заморожен с помощью Object.freeze()
, чтобы предотвратить изменения.
1 2 |
|
JSON¶
Для проверки любого значения, которое можно закодировать в формате JSON:
1 |
|
Это удобный API, который возвращает следующую объединенную схему:
1 2 3 4 5 6 7 8 9 10 |
|
Пользовательский¶
Вы можете создать схему Zod для любого типа TypeScript с помощью z.custom()
. Это полезно для создания схем для типов, которые не поддерживаются Zod из коробки, таких как шаблонные строковые литералы.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Если вы не предоставите функцию проверки, Zod будет допускать любые значения. Это может быть опасно!
1 |
|
Вы можете настроить сообщение об ошибке и другие параметры, передавая второй аргумент. Этот параметр работает так же, как параметр params в .refine
.
1 |
|
Функции¶
В Zod 4 функция z.function()
больше не возвращает схему Zod.
Zod предоставляет утилиту z.function()
для определения функций, проверенных Zod. Таким образом, вы можете избежать смешивания кода проверки с вашей бизнес-логикой.
1 2 3 4 |
|
Схемы функций имеют метод .implement()
, который принимает функцию и возвращает новую функцию, которая автоматически проверяет ее входы и выходы.
1 2 3 4 5 6 7 8 9 |
|
Эта функция вызовет ошибку ZodError
, если входные данные недействительны:
1 |
|
Если вас интересует только проверка входных данных, поле output
можно опустить.
1 2 3 4 5 6 7 |
|