Декоратор @IsAscii() применяется для проверки строкового
значения на соответствие набору ASCII-символов. Поддерживаются только
символы с кодами от 0 до 127 включительно, что делает его полезным в
задачах, где требуется строгая совместимость с ограниченными текстовыми
форматами, протоколами или внешними системами, не поддерживающими
Unicode.
ASCII-строка считается валидной, если каждый символ входит в стандартную таблицу ASCII. Это означает отсутствие кириллицы, акцентов, эмодзи и любых расширенных Unicode-символов.
Пример допустимых значений:
HelloWorld
user123
email@example.com
Пример недопустимых значений:
Привет
café
hello?
В основе работы декоратора лежит регулярная проверка символов строки на соответствие диапазону ASCII.
@IsAscii() используется в DTO-классах и моделях
валидации, чаще всего в связке с class-validator.
import { IsAscii } from 'class-validator';
export class CreateUserDto {
@IsAscii()
username: string;
}
В данном случае поле username будет считаться валидным
только при условии, что оно содержит исключительно ASCII-символы.
При передаче строки валидатор проходит по каждому символу и проверяет его код. Если хотя бы один символ выходит за пределы ASCII-таблицы, валидация завершается ошибкой.
Пример ошибки:
{
"username": "Иван"
}
Результат валидации:
В экосистеме NestJS @IsAscii() часто применяется в Data
Transfer Objects для контроля входящих данных.
import { IsAscii, IsString } from 'class-validator';
export class LoginDto {
@IsString()
@IsAscii()
login: string;
@IsString()
@IsAscii()
password: string;
}
Такой подход ограничивает возможность передачи символов, которые могут быть некорректно обработаны на уровне базы данных, логирования или сторонних API.
@IsAscii() редко используется изолированно. Обычно он
комбинируется с другими валидаторами для усиления контроля над входными
данными.
import { IsAscii, Length } from 'class-validator';
export class TokenDto {
@IsAscii()
@Length(10, 64)
token: string;
}
Здесь одновременно проверяется:
import { IsAscii, IsNotEmpty, IsString } from 'class-validator';
export class ApiKeyDto {
@IsString()
@IsNotEmpty()
@IsAscii()
apiKey: string;
}
Комбинация обеспечивает:
ASCII-ограничение полезно для полей, которые используются как ключи:
export class FileDto {
@IsAscii()
fileId: string;
}
Такие значения часто передаются в URL, файловых системах или внешних сервисах.
Многие системы требуют строго ASCII-совместимые строки:
export class AuthDto {
@IsAscii()
accessToken: string;
}
Использование Unicode в токенах может привести к ошибкам сериализации или кодирования.
Некоторые внешние сервисы поддерживают только латиницу и базовые символы:
export class ExternalUserDto {
@IsAscii()
username: string;
}
ASCII включает пробел и базовые знаки пунктуации, поэтому следующие значения считаются допустимыми:
"hello world"
"user.name"
"user_name"
"user-name"
Однако символы вроде:
éüж?автоматически приводят к ошибке валидации.
class-validator работает после преобразования входных
данных в объекты классов (обычно через class-transformer).
Если данные приходят в виде Buffer или уже нормализованной строки,
проверка ASCII выполняется на итоговом значении.
Важно учитывать, что предварительная трансформация может изменить строку, например при декодировании URL-encoded данных.
Логика проверки основана на простом проходе по строке:
0–127Это делает декоратор достаточно быстрым даже на длинных строках.
@IsAscii() не различает смысловые типы данных и не
проверяет контекст. Он не гарантирует:
Он проверяет исключительно кодировку символов.
В сложных системах @IsAscii() часто выступает как
базовый слой фильтрации, поверх которого накладываются дополнительные
проверки.
import { Validate, IsAscii } from 'class-validator';
export class CustomDto {
@IsAscii()
@Validate(CustomBusinessRule)
code: string;
}
Такой подход разделяет:
Как и большинство декораторов class-validator,
@IsAscii() по умолчанию игнорирует undefined и
null, если не добавлены ограничения вроде
@IsNotEmpty() или @IsDefined().
export class ExampleDto {
@IsAscii()
value?: string;
}
Здесь отсутствие значения не вызовет ошибку, но наличие не-ASCII строки приведёт к отказу.
При работе с внешними источниками данных важно учитывать:
@IsAscii() становится критическим ограничением в
системах, где требуется строгая совместимость с legacy-протоколами или
бинарными форматами, рассчитанными только на ASCII.
Проверка ASCII является одной из самых дешёвых операций в
class-validator, поскольку:
Это позволяет использовать декоратор массово без заметной нагрузки даже при обработке больших DTO-наборов.