Библиотека Superstruct предоставляет набор примитивов и композиций для декларативной валидации данных. Одним из ключевых аспектов работы с входными структурами становится контроль размеров: длины строк, количества элементов в массивах, глубины вложенных объектов и других количественных характеристик.
Ограничения размера данных используются для предотвращения переполнения памяти, защиты от чрезмерно больших payload’ов, а также для поддержания бизнес-логики, где допустимый объём данных заранее определён.
Для строк в Superstruct применяются проверки минимальной и
максимальной длины. Базовый структурный примитив string()
может быть дополнен модификаторами min() и
max().
import { string, min, max, validate } from 'superstruct';
const Username = min(max(string(), 20), 3);
validate('ab', Username); // ошибка: меньше 3 символов
validate('valid_name', Username); // успешно
validate('very_long_username_exceeding_limit', Username); // ошибка
Логика построена композиционно: каждый валидатор возвращает новую структуру, накладывающую дополнительное ограничение.
Часто используется также функция size(), которая
фиксирует точное значение длины:
import { size, string } from 'superstruct';
const FixedCode = size(string(), 6);
validate('ABC123', FixedCode); // успешно
validate('ABC12', FixedCode); // ошибка
Применение фиксированной длины характерно для кодов подтверждения, идентификаторов формата UUID-подобных сокращений и системных токенов фиксированного размера.
Массивы в Superstruct также поддерживают контроль количества
элементов. Используется комбинация array() с
min(), max() и size().
import { array, number, min, max, validate } from 'superstruct';
const Scores = min(max(array(number()), 10), 1);
validate([1, 2, 3], Scores); // успешно
validate([], Scores); // ошибка: меньше 1 элемента
validate([1,2,3,4,5,6,7,8,9,10,11], Scores); // ошибка: больше 10 элементов
Фиксированный размер массива задаётся через size():
import { array, string, size } from 'superstruct';
const RGB = size(array(number()), 3);
validate([255, 0, 128], RGB); // успешно
validate([255, 0], RGB); // ошибка
Такой подход часто применяется при описании структур цветов, координат, фиксированных наборов параметров.
Ограничения длины часто используются совместно с проверками типа и дополнительных условий. Superstruct позволяет строить сложные композиции без потери читаемости.
import { object, string, array, number, min, max } from 'superstruct';
const User = object({
name: min(max(string(), 30), 2),
tags: max(array(string()), 5),
ratings: min(max(array(number()), 10), 1)
});
В данной структуре одновременно контролируются:
nameКомпозиционный подход позволяет строить строгие схемы без необходимости написания отдельной логики валидации.
Контроль размера распространяется не только на примитивные типы, но и
на вложенные объекты через комбинацию
array(object(...)).
import { array, object, string, min, max } from 'superstruct';
const Comment = object({
text: min(max(string(), 200), 1)
});
const Post = object({
title: string(),
comments: max(array(Comment), 100)
});
Здесь ограничивается не только длина текста комментария, но и максимальное количество комментариев в публикации.
При несоответствии ограничениям Superstruct возвращает структурированную ошибку. Она содержит информацию о пути до некорректного значения, ожидаемом типе и фактическом значении.
import { validate, string, max } from 'superstruct';
const Name = max(string(), 5);
const [error] = validate('exceeding', Name);
console.log(error);
// {
// path: [],
// value: 'exceeding',
// type: 'max',
// refinement: 'max',
// branch: [...]
// }
Такая структура ошибок позволяет строить детализированные системы логирования и отображения сообщений без дополнительного анализа входных данных.
Контроль длины данных применяется в нескольких ключевых сценариях:
Особенно важным является использование ограничений на уровне схемы, а не бизнес-логики, что позволяет централизовать правила валидации.
Проверки размера в Superstruct выполняются за O(1) для строк и за O(n) для массивов, где n — количество элементов. Однако ранний выход при нарушении условий позволяет минимизировать затраты при больших структурах.
Композиция валидаторов не приводит к значительному оверхеду, поскольку каждый слой проверяет только свою часть данных без повторного обхода структуры.
На практике часто встречаются следующие некорректные подходы:
max() без min(), что
допускает пустые значения там, где они недопустимыКорректная модель валидации предполагает централизованное определение ограничений непосредственно в структуре данных.
В TypeScript-окружениях Superstruct позволяет сочетать ограничения размера с выводом типов:
import { string, size, Infer } from 'superstruct';
const Token = size(string(), 16);
type TokenType = Infer<typeof Token>;
Тип TokenType сохраняет базовый тип string,
однако логически связан с ограничением длины, которое применяется во
время выполнения.
Использование ограничений размера формирует предсказуемую структуру данных на уровне системы. Это влияет на:
Строгие границы размеров позволяют избежать неконтролируемого роста данных и упрощают масштабирование систем.