validate
Проверяет данные по схеме и возвращает результат: валидны ли они, очищенные данные и ошибки. Никогда не бросает исключение из-за невалидных данных.
Сигнатура
ts
function validate<S extends Schema>(schema: S, value: unknown, options?: Options): Result<Infer<S>>Параметры
| Параметр | Тип | Описание |
|---|---|---|
schema | Schema | Схема, по которой проверяются данные |
value | unknown | Любые данные: объект из формы, req.body, строка… |
options | Options | Необязательные опции, см. ниже |
Опции
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
all | boolean | false | Собирать все ошибки поля в issues, а не останавливаться на первой. В errors всё равно попадает первая |
messages | Record<string, Message> | — | Сообщения только для этого вызова — например, язык текущего запроса. Чего нет — берётся из setMessages |
labels | Record<string, string> | — | Названия полей для {label} по пути: { email: 'Почта', 'address.city': 'Город' }. См. label |
maxDepth | number | 256 | Максимальная вложенность рекурсивных схем lazy |
abortEarly | boolean | false | Остановить проверку на первой ошибке. В результате будет одна ошибка — быстрее на сервере, когда подробности не нужны. Для форм не подходит |
Возвращает
| Поле | Тип | Описание |
|---|---|---|
valid | boolean | true, если ошибок нет |
data | T | undefined | Очищенные данные: применены trim, coerce, значения по умолчанию, лишние поля удалены. При ошибке — undefined |
errors | Record<string, string> | Первая ошибка каждого поля. Ключ — путь через точку: name, address.city, items.0.title. Ошибка самого значения — под ключом '' |
issues | Issue[] | Все ошибки по порядку: { code, message, path, params }, где path — массив (['items', 0, 'title']), params — параметры правила ({ min: 8 }) |
Если в схеме есть checkAsync, validate бросит ошибку — используйте validateAsync.
Примеры
Форма в браузере
ts
const Login = object({
email: pipe(string(), trim(), email()),
password: pipe(string(), minLength(8)),
});
const result = validate(Login, { email: 'bad', password: '123' });
result.valid; // false
result.errors; // { email: 'Invalid email', password: 'Must be at least 8 characters long' }Успешная проверка
ts
const result = validate(Login, { email: ' Ivan@Mail.ru ', password: '12345678', remember: 'on' });
result.valid; // true
result.data; // { email: 'Ivan@Mail.ru', password: '12345678' } — пробелы обрезаны, лишнее поле удаленоВсе ошибки поля
ts
const Code = pipe(string(), length(6), pattern(/^\d+$/));
validate(Code, 'abc').issues.length; // 1
validate(Code, 'abc', { all: true }).issues.length; // 2См. также
- validateAsync — то же для асинхронных проверок
- parse — возвращает данные или бросает исключение
- TypeScript — сужение типа результата