Spec-Zone.ru › Valibot

Объекты

Для проверки объектов по схеме можно использовать 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API