В библиотеке Superstruct контроль длины используется для строгого описания допустимых границ данных на уровне строк, массивов и сложных структур. Вместо разрозненных проверок вручную применяются декларативные ограничения, встроенные в композицию структур, что позволяет формировать предсказуемую модель валидации.
Ограничения длины в Superstruct строятся вокруг трёх основных принципов:
Для работы с длиной используются вспомогательные структурные обёртки, которые модифицируют базовые типы.
Для строк длина контролируется через диапазон допустимых значений символов.
import { string, size } from "superstruct";
const Username = size(string(), 3, 12);
В этом примере:
Если значение выходит за пределы, структура возвращает ошибку валидации.
Дополнительно возможно фиксировать точную длину:
const PinCode = size(string(), 4, 4);
Такой подход часто используется для кодов подтверждения, коротких идентификаторов и системных токенов фиксированной длины.
При нарушении границ:
Это позволяет унифицировать обработку всех случаев без специальных условий.
Для массивов применяется тот же механизм через функцию
size, где проверяется количество элементов.
import { array, number, size } from "superstruct";
const Numbers = size(array(number()), 1, 5);
Здесь массив должен содержать от 1 до 5 чисел.
Ограничения длины массива используются для:
Пример строгого ограничения:
const Tags = size(array(string()), 1, 3);
Это гарантирует, что пользователь не сможет передать больше трёх тегов.
Хотя объекты не имеют «длины» в классическом смысле строк и массивов, в Superstruct можно контролировать количество ключей, преобразуя объект через вспомогательные структуры.
Обычно применяется комбинация:
record для описания формы;size для ограничения количества ключей.import { record, string, size } from "superstruct";
const Metadata = size(record(string(), string()), 1, 5);
В этом случае объект должен содержать от 1 до 5 ключей.
При проверке:
undefined всё равно считаются, если ключ
существует.Ограничения длины часто применяются совместно с типизацией:
import { object, string, size } from "superstruct";
const Profile = object({
name: size(string(), 2, 30),
bio: size(string(), 0, 150)
});
Такой подход позволяет одновременно контролировать тип и диапазон длины.
При работе с вложенными данными ограничения длины применяются на каждом уровне независимо.
const Comment = object({
text: size(string(), 1, 200),
replies: size(array(string()), 0, 10)
});
Здесь:
replies дополнительно могут иметь
свои собственные ограничения.В некоторых сценариях границы длины вычисляются динамически:
const max = 10;
const DynamicString = size(string(), 1, max);
Это позволяет адаптировать правила в зависимости от:
При несоответствии ограничениям возвращается структурированная ошибка, содержащая:
Это упрощает обработку ошибок на уровне интерфейса и серверной логики.
Superstruct позволяет переопределять поведение ошибок через обёртки:
import { size, string } from "superstruct";
const ShortName = size(string(), 2, 10);
При интеграции с обработчиком ошибок можно формировать более информативные сообщения, не изменяя саму структуру.
Проверка длины является одной из самых дешёвых операций валидации:
Поэтому ограничения длины обычно применяются в начале цепочки валидации, снижая стоимость последующих проверок.
Часто встречаются следующие проблемы:
Эти ошибки приводят к избыточной сложности схем и ухудшению читаемости.
Если ограничение длины не задано:
Это делает схему максимально гибкой, но менее предсказуемой в контексте бизнес-правил.