Разбор данных
Теперь, когда вы знаете, как создавать схему, давайте посмотрим, как использовать её для проверки неизвестных данных и обеспечения их типобезопасности. Есть три способа это сделать.
У каждой схемы есть метод
~run. Однако это внутренний API, и его следует использовать только в том случае, если вы понимаете, что делаете.
Разбор с выбросом ошибки
Метод parse выбросит ошибку ValiError, если входные данные не соответствуют схеме. Поэтому для перехвата ошибок следует использовать блок try/catch. Если входные данные соответствуют схеме, они считаются корректными, и результат схемы будет возвращён с правильным типом TypeScript.
import * as v from 'valibot';
try {
const EmailSchema = v.pipe(v.string(), v.email());
const email = v.parse(EmailSchema, 'jane@example.com');
// Handle errors if one occurs
} catch (error) {
console.log(error);
}
Разбор с возвратом результата
Если вы хотите получать сведения об ошибках, а не выбрасывать их, можно использовать safeParse. Возвращаемое значение содержит свойство .success, которое равно true, если входные данные корректны, и false в противном случае.
Если входные данные корректны, результат проверки схемы можно получить с помощью .output. Если же входные данные некорректны, найденные ошибки можно получить через .issues.
import * as v from 'valibot';
const EmailSchema = v.pipe(v.string(), v.email());
const result = v.safeParse(EmailSchema, 'jane@example.com');
if (result.success) {
const email = result.output;
} else {
console.log(result.issues);
}
Защитные проверки типов
Ещё один способ проверки данных, который может быть полезен в отдельных случаях, — использовать защитную проверку типа. Можно использовать предикат типа с методом is или функцию утверждения с методом assert.
При использовании защитной проверки типа ошибки проверки получить нельзя. Кроме того, преобразования не выполняются, а неизвестные ключи объекта не удаляются. Поэтому этот подход не так безопасен и эффективен, как два предыдущих. Также из-за ограничения TypeScript в настоящее время его можно использовать только с синхронными схемами.
import * as v from 'valibot';
const EmailSchema = v.pipe(v.string(), v.email());
const data: unknown = 'jane@example.com';
if (v.is(EmailSchema, data)) {
const email = data; // string
}
Конфигурация
По умолчанию Valibot собирает все ошибки, возникающие при проверке, чтобы подробно объяснить, почему входные данные не соответствуют схеме. Если в вашем случае это не требуется, можно управлять этим поведением с помощью abortEarly и abortPipeEarly, чтобы повысить производительность проверки.
Прерывание проверки
Если установить abortEarly в значение true, проверка данных немедленно прервётся при обнаружении первой ошибки. Если вам нужно лишь узнать, соответствуют ли данные схеме, а подробности не важны, это может повысить производительность.
import * as v from 'valibot';
try {
const ProfileSchema = v.object({
name: v.string(),
bio: v.string(),
});
const profile = v.parse(
ProfileSchema,
{ name: 'Jane', bio: '' },
{ abortEarly: true }
);
// Handle errors if one occurs
} catch (error) {
console.log(error);
}
Прерывание конвейера
Если установить только abortPipeEarly в значение true, проверка в конвейере будет прервана только после обнаружения первой ошибки. Например, если при проверке формы нужно показать лишь первую ошибку поля, этот параметр поможет повысить производительность.
import * as v from 'valibot';
try {
const EmailSchema = v.pipe(v.string(), v.email(), v.endsWith('@example.com'));
const email = v.parse(EmailSchema, 'jane@example.com', {
abortPipeEarly: true,
});
// Handle errors if one occurs
} catch (error) {
console.log(error);
}
© Fabian Hiller
Licensed under the MIT License.
https://valibot.dev/guides/parse-data/