Перейти к основному содержимому

Собственные валидаторы

Введение

Автоматически создаваемые типы Zod для примитивных полей не всегда могут покрыть все ваши потребности. К примеру, для поле с атрибутом Attr по умолчанию создаётся схема типа z.unknown(). Это ограничивает возможности валидации структур.

Кроме того, иногда нужно убедиться, что строка длиннее определённого количества символов, или число меньше какого-либо максимального значения.

Для этого вы можете назначить свои схемы Zod любому из полей. Это можно сделать двумя способами, о которых пойдёт речь ниже.

Важно

Схема, которую вы определите, не дополняет, а заменяет автоматически сгенерированную. Учитывайте это при написании типов.

Определение через статическое свойство

Для JavaScript и TypeScript можно определить свои схемы для полей при помощи статического свойства класса вашей модели, как это сделано со свойством entity:

import { z } from 'zod'

export class User extends Model {
public static entity = 'user'

public static $zodSchemas = {
age: z.number().gt(18)
}

@NumberField(0)
public age: number
}

В итоге свойство age будет валидироваться определённой вами схемой, остальные поля будут работать как раньше. Базовая валидация для Num работать не будет.

Определение через декораторы

То же самое можно сделать с помощью декоратора ZodFieldType:

import { z } from 'zod'
import { ZodFieldType } from '@rattus-orm/plugin-zod-validate'

export class User extends Model {
public static entity = 'user'

@ZodFieldType(z.number().gt(18))
@NumberField(0)
public age: number
}