Объекты
Для проверки объектов по схеме можно использовать object или record. Используйте object для объекта с определенной структурой и record для объектов с любым количеством однотипных записей.
Схема объекта
Первый аргумент используется для определения конкретной структуры объекта. Каждая запись состоит из ключа и схемы в качестве значения. Затем записи входных данных проверяются по этим схемам.
import * as v from 'valibot';
const ObjectSchema = v.object({
key1: v.string(),
key2: v.number(),
});
Нестрогие и строгие объекты
Схема object удаляет неизвестные записи. Это означает, что записи, которые вы не определили в первом аргументе, не проверяются и не добавляются в выходные данные. Это поведение можно изменить, используя вместо нее схему looseObject или strictObject.
Схема looseObject разрешает неизвестные записи и добавляет их в выходные данные. Схема strictObject запрещает неизвестные записи и возвращает ошибку при обнаружении первой неизвестной записи.
Объект с заданной схемой для остальных записей
Также можно использовать схему objectWithRest, чтобы задать определенную схему для неизвестных записей. Все записи, не определенные в первом аргументе, проверяются по схеме, переданной вторым аргументом.
import * as v from 'valibot';
const ObjectSchema = v.objectWithRest(
{
key1: v.string(),
key2: v.number(),
},
v.null()
);
Проверка в конвейере
Чтобы проверить значение записи на основе другой записи, можно обернуть схему действием проверки check в конвейере. Также можно использовать forward, чтобы в случае ошибки связать ее с определенным ключом объекта.
Если нужно проверить только определенные записи, рекомендуем использовать вместо этого
partialCheck, посколькуcheckможно выполнить, только если входные данные типизированы полностью.
import * as v from 'valibot';
const CalculationSchema = v.pipe(
v.object({
a: v.number(),
b: v.number(),
sum: v.number(),
}),
v.forward(
v.check(({ a, b, sum }) => a + b === sum, 'The calculation is incorrect.'),
['sum']
)
);
Схема записи
Для объекта с любым количеством однотипных записей подойдет record. Схема, переданная первым аргументом, проверяет ключи записи, а схема, переданная вторым аргументом, проверяет значения.
import * as v from 'valibot';
const RecordSchema = v.record(v.string(), v.number()); // Record<string, number>
Определенные ключи записи
Вместо string для проверки ключей также можно использовать custom, enum, literal, picklist или union.
import * as v from 'valibot';
const RecordSchema = v.record(v.picklist(['key1', 'key2']), v.number()); // { key1?: number; key2?: number }
Обратите внимание, что в этом случае record помечает все литеральные ключи как необязательные. Чтобы сделать их обязательными, можно использовать схему object вместе с утилитой entriesFromList.
import * as v from 'valibot';
const RecordSchema = v.object(v.entriesFromList(['key1', 'key2'], v.number())); // { key1: number; key2: number }
Проверка в конвейере
Чтобы проверить значение записи на основе другой записи, можно обернуть схему действием проверки check в конвейере. Также можно использовать forward, чтобы в случае ошибки связать ее с определенным ключом записи.
import * as v from 'valibot';
const CalculationSchema = v.pipe(
v.record(v.picklist(['a', 'b', 'sum']), v.number()),
v.forward(
v.check(
({ a, b, sum }) => (a || 0) + (b || 0) === (sum || 0),
'The calculation is incorrect.'
),
['sum']
)
);
© Fabian Hiller
Licensed under the MIT License.
https://valibot.dev/guides/objects/