Декоратор @IsHexColor в библиотеке Class-validator
предназначен для валидации строковых значений, представляющих цвет в
шестнадцатеричном формате. Он используется в классах DTO (Data Transfer
Object) и позволяет гарантировать, что входные данные соответствуют
стандарту HEX-цветов, применяемых в CSS, графических интерфейсах и
конфигурационных схемах.
Основная задача декоратора — проверка строки на соответствие формату:
#RRGGBB#RGB#RRGGBBAA, #RGBA), в зависимости от
параметров валидации и версии реализации.Декоратор применяется к строковому свойству класса и не требует дополнительных параметров в простейшем случае.
import { IsHexColor } from 'class-validator';
class ThemeDto {
@IsHexColor()
primaryColor: string;
}
В этом примере свойство primaryColor должно содержать
корректный HEX-код цвета, например:
#ffffff#000#1a2b3cЛюбое значение, не соответствующее формату, будет считаться ошибочным.
Валидация охватывает несколько распространённых форматов записи:
#RRGGBB
Пример:
#ff0000#00ff00#0000ffКаждая пара символов отвечает за интенсивность красного, зелёного и синего каналов.
#RGB
Пример:
#f00#0f0#00fКаждый символ автоматически интерпретируется как дублирующийся
(#f00 → #ff0000).
#RRGGBBAA
#RGBA
Пример:
#ff000080#0f08Альфа-канал определяет прозрачность цвета.
@IsHexColor использует регулярное выражение для проверки
строки. Общая логика сводится к следующим шагам:
Проверка наличия символа # в начале строки.
Проверка длины строки:
#RGB)#RRGGBB)Проверка соответствия допустимым символам:
0–9a–fA–FЛюбые отклонения приводят к ошибке валидации.
В реальных приложениях цветовые значения часто используются в сочетании с другими параметрами конфигурации интерфейса.
import { IsString, IsHexColor, IsOptional } from 'class-validator';
class ButtonStyleDto {
@IsHexColor()
backgroundColor: string;
@IsHexColor()
textColor: string;
@IsOptional()
@IsHexColor()
borderColor?: string;
}
В этом случае валидируются сразу несколько свойств, каждое из которых должно содержать корректный HEX-код.
При несоответствии формату Class-validator формирует объект ошибок, содержащий:
Пример результата:
[
{
"property": "primaryColor",
"value": "blue",
"constraints": {
"isHexColor": "primaryColor must be a hex color"
}
}
]
Сообщение по умолчанию может быть переопределено через параметры декоратора.
Хотя @IsHexColor не предоставляет большого набора опций,
стандартный механизм Class-validator позволяет задать собственное
сообщение.
import { IsHexColor } from 'class-validator';
class ThemeDto {
@IsHexColor({ message: 'Неверный формат HEX-цвета' })
primaryColor: string;
}
Это особенно полезно при построении пользовательских API, где требуется локализация или унифицированные сообщения об ошибках.
@IsHexColor часто используется совместно с другими
декораторами для усиления проверки входных данных.
import { IsNotEmpty, IsHexColor } from 'class-validator';
class ColorDto {
@IsNotEmpty()
@IsHexColor()
value: string;
}
Здесь сначала проверяется наличие значения, затем его корректность.
Несмотря на универсальность, декоратор имеет ряд особенностей:
Это означает, что значение #GGGGGG будет отклонено,
несмотря на правильную длину и структуру, так как символы не входят в
допустимый диапазон шестнадцатеричной системы.
В системах настройки интерфейса HEX-цвета часто приходят от клиента:
class UiConfigDto {
@IsHexColor()
accentColor: string;
@IsHexColor()
background: string;
}
Используется для динамической смены тем:
class ThemeDto {
@IsHexColor()
primary: string;
@IsHexColor()
secondary: string;
@IsHexColor()
danger: string;
}
HEX-значения применяются как часть дизайн-систем:
class DesignTokenDto {
@IsHexColor()
brandColor: string;
@IsHexColor()
hoverColor: string;
}
При использовании Class-validator в связке с NestJS или аналогичными
фреймворками, проверка @IsHexColor происходит на этапе
валидационного пайплайна. Это позволяет отсечь некорректные запросы до
попадания в бизнес-логику.
Типичный сценарий:
Использование @IsHexColor заменяет необходимость ручного
написания регулярных выражений:
const regex = /^#([0-9a-fA-F]{3}){1,2}$/;
или расширенного варианта:
const regex = /^#([0-9a-fA-F]{3,4}){1,2}$/;
Декоратор инкапсулирует эту логику и снижает вероятность ошибок при повторном использовании.