Пустые значения
tinyval считает пустыми три значения: undefined, null и пустую строку ''.
Как это работает
| Значение | Обязательная схема (string(), object()…) | optional() | nullable() |
|---|---|---|---|
undefined | ошибка required | пропуск / значение по умолчанию | ошибка required |
'' | ошибка required | пропуск / значение по умолчанию | ошибка required |
null | ошибка required | ошибка required | null |
Почему так
Из HTML-форм незаполненное поле приходит пустой строкой, а не undefined. Если считать '' обычной строкой, то обязательное поле «Имя» с пустым инпутом проходило бы проверку, а необязательное поле «Сайт» падало бы на проверке формата URL.
Laravel решает это так же — middleware ConvertEmptyStringsToNull превращает пустые строки в null до валидации.
Частые случаи
ts
// Обязательное поле: '' даёт ошибку Required
name: string()
// Необязательное: '' и undefined пропускаются, поле не попадёт в data
website: optional(pipe(string(), pattern(/^https?:\/\//)))
// Необязательное со значением по умолчанию
role: optional(oneOf(['admin', 'user']), 'user')
// Может быть null (например, из JSON с сервера) или отсутствовать
middleName: optional(nullable(string()))
// Нужна именно пустая строка как значение
comment: optional(string(), '')Строка из пробелов
' ' — не пустая строка, поэтому string() её пропустит. Чтобы запретить такие значения, обрежьте пробелы и проверьте длину:
ts
name: pipe(string(), trim(), minLength(1))