Структура number в Superstruct предназначена для строгой
проверки числовых значений в рантайме. Она используется для контроля
входных данных, конфигураций, параметров API и любых значений, которые
должны быть представлены числом. В отличие от поверхностных проверок
typeof, механизм Superstruct позволяет строить
композиционные, расширяемые и строго типизированные правила.
Основная функция для числовой проверки создаётся через
number():
import { number, validate } fr om 'superstruct'
const Age = number()
validate(25, Age) // ok
validate('25', Age) // ошибка
validate(NaN, Age) // ошибка
Ключевое поведение:
numberNaN считается невалидным значениемInfinity и -Infinity также не проходят
проверкуТаким образом, number() обеспечивает строгую защиту от
неявных преобразований, характерных для JavaScript.
Числовые структуры часто ограничиваются диапазонами. Superstruct позволяет задавать минимальные и максимальные границы.
import { number, min, max, validate } from 'superstruct'
const Positive = min(number(), 1)
const SmallRange = max(min(number(), 10), 100)
validate(5, Positive) // ok
validate(0, Positive) // ошибка
validate(50, SmallRange) // ok
validate(150, SmallRange) // ошибка
Логика ограничений:
min(struct, value) задаёт нижнюю границу
включительноmax(struct, value) задаёт верхнюю границу
включительноДиапазоны применяются для:
Для ситуаций, где дробные значения недопустимы, применяется дополнительная проверка на целочисленность.
import { number, refine, validate } from 'superstruct'
const Integer = refine(number(), 'integer', (value) =>
Number.isInteger(value)
)
validate(10, Integer) // ok
validate(10.5, Integer) // ошибка
Характеристики:
Number.isIntegerТипичные области применения:
В JavaScript числовая система включает специальные значения
Infinity и NaN. Superstruct требует явного
контроля таких случаев.
import { number, refine } from 'superstruct'
const FiniteNumber = refine(number(), 'finite', (value) =>
Number.isFinite(value)
)
Такой подход исключает:
NaNInfinity-InfinityЭто особенно важно при вычислениях, где любые некорректные значения могут нарушить бизнес-логику.
Superstruct по умолчанию не выполняет неявные преобразования. Это принципиальное отличие от слабой типизации JavaScript.
validate('42', number()) // ошибка
validate('42' * 1, number()) // ok (результат операции)
Для случаев, где требуется преобразование входных данных, используется дополнительная логика:
const toNumber = (value) => {
const parsed = Number(value)
return Number.isFinite(parsed) ? parsed : value
}
Далее уже применяется структура:
const Value = number()
Такой подход отделяет этап нормализации данных от этапа валидации.
Функция refine позволяет расширять базовую числовую
структуру любыми условиями.
import { number, refine } from 'superstruct'
const EvenNumber = refine(number(), 'even', (value) =>
value % 2 === 0
)
Примеры расширений:
Композиция позволяет строить доменные типы:
const Price = refine(number(), 'price', (value) =>
value >= 0 && value <= 1000000
)
Числовые структуры часто используются в объектах, где часть полей может отсутствовать.
import { number, optional } from 'superstruct'
const Schema = {
lim it: optional(number())
}
Поведение:
null не считается допустимым значениемДля значений по умолчанию используется отдельная логика:
const withDefault = (value, fallback) =>
value === undefined ? fallback : value
При неуспешной проверке Superstruct возвращает структурированную ошибку.
import { number, validate } from 'superstruct'
const [error, result] = validate('abc', number())
Типичные причины ошибок:
NaNrefineОшибки удобно использовать для:
const Config = {
port: number(),
timeout: number()
}
const Query = {
page: number(),
pageSize: number()
}
const Amount = refine(number(), 'amount', (v) => v >= 0)
Числовые структуры часто становятся частью сложных схем:
import { object, array, number } from 'superstruct'
const Model = object({
id: number(),
values: array(number())
})
Такой подход обеспечивает строгую типизацию вложенных данных:
Особое внимание уделяется нестандартным числовым значениям Jav * aScript:
NaN всегда невалиденInfinity и -Infinity исключаютсяnew Number(5) может приводиться к primitive, но не
гарантируется валидацией без приведенияТакая строгость исключает скрытые ошибки, возникающие из-за автоматического приведения типов в JavaScript-экосистеме.