Декоратор @IsHexadecimal относится к группе валидаторов
строковых значений и предназначен для проверки, что значение
представляет собой корректное шестнадцатеричное число. Проверка
выполняется на уровне строки и допускает только символы, входящие в
диапазон 0-9, a-f, A-F. Любые
другие символы приводят к ошибке валидации.
Шестнадцатеричный формат широко используется при работе с цветами, бинарными данными, хешами, идентификаторами и низкоуровневыми представлениями данных. Валидация таких значений позволяет исключить некорректные строки до попадания в бизнес-логику приложения.
IsHexadecimal проверяет исключительно синтаксическую
корректность строки. Он не интерпретирует значение как число и не
выполняет преобразование типов. Проверка основывается на регулярном
выражении, эквивалентном набору допустимых символов.
Ключевые характеристики:
0-9, a-f,
A-Feach)0x или #Примеры допустимых значений:
ffA1B2C3deadBEEF0123456789abcdefПримеры недопустимых значений:
0xFF (содержит префикс)#FFAA00 (содержит символ #)GGHHII (символы вне диапазона)12 34 (пробел)В библиотеке class-validator декоратор используется
следующим образом:
IsHexadecimal(validationOptions?: ValidationOptions)
Параметр validationOptions позволяет управлять
поведением валидации:
message — пользовательское сообщение об ошибкеgroups — группы валидацииeach — применение к каждому элементу массиваcontext — дополнительный контекст ошибкиТиповой сценарий — проверка строкового свойства DTO:
import { IsHexadecimal } from "class-validator";
class ColorDto {
@IsHexadecimal()
value: string;
}
В данном случае поле value должно содержать корректную
шестнадцатеричную строку без дополнительных символов.
Сообщение ошибки может быть переопределено для унификации ответов API:
import { IsHexadecimal } from "class-validator";
class HashDto {
@IsHexadecimal({
message: "Значение должно быть шестнадцатеричной строкой",
})
hash: string;
}
Такой подход используется в системах, где требуется стандартизированный формат ошибок без раскрытия внутренних деталей валидации.
При использовании опции each: true проверка применяется
к каждому элементу массива:
import { IsHexadecimal } from "class-validator";
class BatchDto {
@IsHexadecimal({ each: true })
values: string[];
}
В этом случае массив считается валидным только при условии, что каждый его элемент соответствует шестнадцатеричному формату. Один некорректный элемент делает весь массив невалидным.
class-validator не выполняет автоматическое
преобразование типов. Это означает, что значение должно быть строкой до
начала валидации.
Типичная ошибка возникает при передаче чисел:
class ExampleDto {
@IsHexadecimal()
value: string;
}
Передача значения:
{
"value": 255
}
приведёт к ошибке, поскольку число не рассматривается как допустимый формат, даже если его строковое представление могло бы быть валидным.
Для корректной работы часто используется предварительная
трансформация через class-transformer.
@IsAlphanumeric@IsAlphanumeric допускает буквы и цифры без ограничения
диапазона, тогда как @IsHexadecimal ограничивает буквенные
символы строго диапазоном a-f.
@Matches@Matches предоставляет универсальный механизм через
регулярные выражения. @IsHexadecimal является
специализированной и более семантически выразительной альтернативой для
конкретного случая.
Пример эквивалентной проверки через @Matches:
@Matches(/^[0-9a-fA-F]+$/)
Использование специализированного декоратора повышает читаемость и снижает вероятность ошибок в регулярных выражениях.
IsHexadecimal не предназначен для проверки наличия
значения. Пустые строки считаются невалидными.
При необходимости допуска пустого значения используется комбинация с
@IsOptional:
import { IsHexadecimal, IsOptional } from "class-validator";
class ExampleDto {
@IsOptional()
@IsHexadecimal()
value?: string;
}
В этом случае проверка выполняется только при наличии значения.
Распространённый сценарий — проверка HEX-цветов без символа
#:
class ThemeDto {
@IsHexadecimal()
primaryColor: string;
@IsHexadecimal()
secondaryColor: string;
}
Важно учитывать, что популярный CSS-формат #RRGGBB
требует предварительного удаления символа # перед
валидацией.
Валидация носит строго символьный характер и не учитывает:
Это означает, что строка "0" является валидной, хотя
может быть недостаточной в контексте некоторых бизнес-правил.
При необходимости ограничения длины комбинируется с
@MinLength и @MaxLength:
import { IsHexadecimal, MinLength, MaxLength } from "class-validator";
class StrictHexDto {
@IsHexadecimal()
@MinLength(6)
@MaxLength(6)
color: string;
}
В сложных структурах данных IsHexadecimal часто
применяется в сочетании с другими валидаторами:
import { IsHexadecimal, IsString, Length } from "class-validator";
class TokenDto {
@IsString()
@IsHexadecimal()
@Length(32, 32)
accessToken: string;
}
Такой подход позволяет одновременно гарантировать формат и фиксированную длину значения.
В системах, где идентификаторы представлены в hex-формате (например, хеши транзакций или бинарные ключи), валидатор обеспечивает первичную защиту от некорректного ввода данных до обращения к базе данных или внешним сервисам.
Типичный пример:
class TransactionDto {
@IsHexadecimal()
transactionId: string;
}
Подобная проверка снижает вероятность ошибок при поиске записей по идентификаторам фиксированного формата.
При наследовании классов валидаторы сохраняют своё поведение, однако порядок выполнения может зависеть от структуры пайплайна валидации:
class BaseDto {
@IsHexadecimal()
id: string;
}
class ExtendedDto extends BaseDto {
name: string;
}
Валидация поля id сохраняется в производных классах без
дополнительных объявлений.
Проверка реализована через регулярное выражение и выполняется за линейное время относительно длины строки. Это делает декоратор подходящим для массовой валидации входных данных в API без заметного влияния на производительность.
При обработке больших массивов узким местом становится не сама проверка, а инфраструктурные операции сериализации и трансформации данных.
На практике встречаются следующие ошибки конфигурации:
0x форматаКорректная схема обычно включает предварительную нормализацию входных данных и последующую валидацию только очищенных строковых значений