Литеральные значения в валидации данных представляют собой один из самых строгих и предсказуемых механизмов ограничения входных значений. В контексте Superstruct они позволяют зафиксировать структуру так, чтобы допустимым считалось только одно конкретное значение, без диапазонов, альтернатив или преобразований.
Литеральная структура в Superstruct описывает правило: значение
должно совпадать с эталоном строго и без отклонений. Проверка
выполняется через строгое сравнение (===) для примитивов и
ссылочное сравнение для объектов.
Это означает:
true или
false в зависимости от конфигурации;Любое отклонение приводит к ошибке валидации.
В Superstruct литеральные значения создаются с помощью функции
literal.
import { literal } from 'superstruct';
const ActiveStatus = literal('active');
Такое определение фиксирует допустимое значение строго как строку
'active'. Любые другие строки будут считаться
невалидными.
Пример проверки:
ActiveStatus.assert('active'); // проходит
ActiveStatus.assert('inactive'); // ошибка
Чаще всего литералы применяются к строкам, числам и булевым значениям.
const Role = literal('admin');
Значение строго фиксировано:
Role.assert('admin'); // ok
Role.assert('user'); // error
const HttpOk = literal(200);
HttpOk.assert(200); // ok
HttpOk.assert(404); // error
const IsEnabled = literal(true);
IsEnabled.assert(true); // ok
IsEnabled.assert(false); // error
При использовании объектов поведение становится менее интуитивным, поскольку сравнение происходит по ссылке.
const config = { mode: 'dark' };
const Theme = literal(config);
Корректным будет только тот же самый объект:
Theme.assert(config); // ok
Theme.assert({ mode: 'dark' }); // error
Даже идентичная по структуре копия считается отличной, поскольку это другой объект в памяти.
Литеральные значения часто используются в комбинации с объединениями для создания ограниченных наборов допустимых значений.
import { union, literal } from 'superstruct';
const Direction = union([
literal('left'),
literal('right'),
literal('up'),
literal('down')
]);
Такая конструкция фактически заменяет перечисление, задавая фиксированный набор допустимых вариантов.
Проверка:
Direction.assert('left'); // ok
Direction.assert('down'); // ok
Direction.assert('forward'); // error
Литеральные объединения часто используются вместо перечислений. В
отличие от TypeScript enum, здесь нет дополнительного
рантайм-слоя, а поведение полностью определяется структурой.
Преимущества подхода:
union.Недостаток проявляется при большом количестве значений, где ручное перечисление становится менее удобным.
Superstruct интегрируется с TypeScript, и литеральные структуры позволяют точно выводить типы.
import { Infer, literal } from 'superstruct';
const Status = literal('success');
type StatusType = Infer<typeof Status>;
StatusType будет строго ограничен значением
'success', что позволяет TypeScript на уровне типов
синхронизироваться с runtime-валидацией.
При объединениях вывод становится расширенным:
const Result = union([
literal('success'),
literal('error')
]);
type ResultType = Infer<typeof Result>;
В результате тип будет 'success' | 'error'.
При несоответствии литеральному значению Superstruct возвращает структурированную ошибку, указывающую на несовпадение ожидаемого и фактического значения.
Типичная ошибка содержит:
Это позволяет использовать литералы в сложных схемах без потери диагностической информации.
Литеральные значения часто встречаются внутри объектов и вложенных структур.
import { object, literal, string } from 'superstruct';
const UserEvent = object({
type: literal('user.created'),
payload: object({
id: string(),
})
});
Такое ограничение гарантирует, что обработчик будет работать только с событиями строго заданного типа.
Литеральные структуры имеют ряд особенностей:
NaN не считается равным самому себе, поэтому его
использование требует осторожности;Литеральные значения выполняют роль жёстких ограничителей доменной модели. Они позволяют:
В комбинации с union, object и
`enums-подобными паттернами они формируют основу строгих схем в
Superstruct, обеспечивая предсказуемость данных на уровне
исполнения.