Декоратор @IsVariableWidth применяется для проверки
строк на соответствие критерию переменной ширины символов. Под
переменной шириной в контексте Unicode понимаются символы, которые могут
иметь различное визуальное представление по ширине: часть из них
относится к полноширинным (full-width), часть — к полуширинным
(half-width), а также существуют символы нейтральной ширины.
Основная задача валидатора заключается в контроле того, что строка содержит допустимое сочетание символов, относящихся к различным категориям ширины, либо соответствует требованиям конкретной системы обработки текста, где важно учитывать визуальную и кодовую неоднородность символов.
Использование данного валидатора чаще всего связано с обработкой мультиязычного текста, особенно в средах, где присутствуют одновременно латиница, кириллица, иероглифические системы письма и совместимые формы ASCII-символов.
Внутренняя проверка ориентируется на свойства Unicode-символов. Каждый символ строки анализируется на предмет его ширины в контексте терминологии Unicode East Asian Width:
Валидация строится вокруг проверки того, что строка содержит допустимое распределение таких символов в зависимости от настроек и контекста использования.
В типичном сценарии @IsVariableWidth применяется для
контроля наличия хотя бы одного символа, выходящего за пределы
стандартной ASCII-ширины, либо для проверки допустимости смешанного
текста.
Строка считается валидной, если она удовлетворяет условиям, связанным с допустимой комбинацией символов разной ширины.
Невалидными считаются случаи:
Результат проверки интегрируется в систему
class-validator как стандартная ошибка валидации с
возможностью передачи сообщения.
Использование декоратора осуществляется внутри классов-DTO, где требуется контроль качества входных данных:
import { IsVariableWidth } from 'class-validator';
class TextPayload {
@IsVariableWidth()
content: string;
}
Данный подход используется в системах, где входной текст должен соответствовать требованиям интернационализации, например при обработке пользовательского контента, комментариев или текстовых полей, предназначенных для хранения смешанных языков.
Как и большинство валидаторов class-validator,
@IsVariableWidth не обрабатывает отсутствие значения как
ошибку по умолчанию. Пустое значение игнорируется, если поле не помечено
как обязательное.
Для обязательности используется комбинация:
@IsDefined@IsNotEmptyВ связке с ними @IsVariableWidth применяется уже к
гарантированно существующему значению.
Особенность работы с переменной шириной символов заключается в том, что результаты проверки могут зависеть от предварительной нормализации строки.
Unicode допускает несколько форм представления одного и того же визуального символа:
При отсутствии нормализации одна и та же строка может давать различное поведение при проверке ширины символов, особенно в случаях совместимых форм (compatibility characters), где визуально одинаковые символы имеют разные кодовые точки.
Основные сценарии применения связаны с обработкой текста в многоязычных системах:
Особую роль валидатор играет в интерфейсах, где используется моноширинное отображение текста (терминалы, таблицы, консольные UI).
Поведение @IsVariableWidth имеет ряд ограничений,
обусловленных природой Unicode:
Из-за этого результат проверки может не полностью совпадать с визуальным восприятием строки.
При нарушении условий формируется стандартная ошибка
ValidationError, содержащая:
isVariableWidthСообщение может быть переопределено:
@IsVariableWidth({ message: 'Строка должна содержать корректные символы переменной ширины' })
content: string;
@IsVariableWidth редко используется изолированно. Чаще
всего он комбинируется с другими проверками:
@IsString — гарантия строкового типа@Length — контроль длины@Matches — регулярные выражения для фильтрации
допустимых символов@IsOptional — разрешение отсутствия значенияКомбинация позволяет формировать строгие правила для текстовых полей, особенно в API-слоях.
В процессе валидации объект проходит последовательную обработку:
class-transformer);@IsVariableWidth участвует в шаге проверки содержимого
строки и не влияет на трансформацию данных.
Оценка строки на соответствие правилам ширины символов требует посимвольного анализа. Сложность алгоритма линейная:
O(n), где n — длина строки.
При обработке больших текстовых массивов (например, документов или логов) это может становиться значимым фактором, особенно при массовой валидации в реальном времени.
На практике часто встречаются некорректные предположения о поведении валидатора:
Такие ошибки приводят к несоответствию между ожидаемым и фактическим результатом валидации.
В архитектуре серверных приложений на Node.js с использованием
DTO-слоя @IsVariableWidth обычно размещается на границе
входных данных:
Его роль заключается не в бизнес-логике, а в первичной санитарной обработке текстовых значений до попадания в доменную модель.