Декоратор @IsCreditCard в class-validator применяется для проверки строкового значения на соответствие формату банковской кредитной карты. Валидация выполняется не только по структуре номера, но и с учётом алгоритма Луна, что позволяет отсеивать случайные или заведомо некорректные значения.
@IsCreditCard используется в DTO-объектах, моделях валидации и слоях входных данных, где требуется гарантировать корректность платежных реквизитов. Основная задача декоратора — обеспечить соответствие значения одному из стандартных форматов карт, используемых международными платёжными системами.
Ключевые характеристики проверки:
Базовое применение:
import { IsCreditCard } from 'class-validator';
export class PaymentDto {
@IsCreditCard()
cardNumber: string;
}
В этом случае применяется стандартная валидация без дополнительных ограничений.
Проверка включает несколько этапов:
Перед анализом входное значение приводится к единому виду:
Пример допустимых входных данных:
4111 1111 1111 11114111-1111-1111-11114111111111111111Все три варианта интерпретируются одинаково.
После нормализации выполняется проверка:
Финальный этап — вычисление контрольной суммы:
Если проверка не проходит, значение считается недействительным независимо от формального соответствия длине и структуре.
Декоратор ориентирован на общую валидацию и не привязан к конкретному типу платёжной системы, но фактически поддерживает распространённые стандарты:
При этом проверка не определяет тип карты, а лишь валидирует корректность номера.
По умолчанию:
undefined и null пропускаются другими
декораторами (@IsOptional() влияет на поведение);Пример комбинирования:
import { IsOptional, IsCreditCard } from 'class-validator';
export class PaymentDto {
@IsOptional()
@IsCreditCard()
cardNumber?: string;
}
Можно переопределить стандартное сообщение:
import { IsCreditCard } from 'class-validator';
export class PaymentDto {
@IsCreditCard({}, { message: 'Номер карты указан некорректно' })
cardNumber: string;
}
Сообщение будет возвращено в массиве ошибок валидации при несоответствии.
В связке с NestJS декоратор используется внутри DTO, а проверка выполняется через ValidationPipe:
import { IsCreditCard } from 'class-validator';
export class CreatePaymentDto {
@IsCreditCard()
cardNumber: string;
}
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
transform: true,
}),
);
При поступлении запроса:
При использовании class-transformer важно учитывать порядок обработки:
Если поле приводится к числу, декоратор @IsCreditCard может начать работать некорректно, поскольку ожидает строку. Поэтому для номеров карт числовой тип не применяется.
Пример корректного подхода:
import { Transform } from 'class-transformer';
import { IsCreditCard } from 'class-validator';
export class PaymentDto {
@Transform(({ value }) => value?.replace(/\s|-/g, ''))
@IsCreditCard()
cardNumber: string;
}
Декоратор применяется к каждому элементу массива через @ValidateNested или комбинацию с @IsArray:
import { IsArray, IsCreditCard } from 'class-validator';
export class BulkPaymentDto {
@IsArray()
@IsCreditCard({ each: true })
cards: string[];
}
Флаг each: true активирует проверку каждого элемента
отдельно.
cardNumber: 4111111111111111
Проблема: число теряет точность в JavaScript и становится некорректным для проверки. Кроме того, декоратор ожидает строку.
+, _, .;Если значение очищается или изменяется до валидации без контроля, можно случайно исказить структуру номера.
Иногда требуется расширить проверку:
В таких случаях @IsCreditCard используется как базовый фильтр, а дополнительные условия реализуются через @Validate или кастомные валидаторы:
import { Validate } from 'class-validator';
export class PaymentDto {
@IsCreditCard()
@Validate(CustomCardValidator)
cardNumber: string;
}
Проверка алгоритма Луна имеет сложность O(n), где n — количество цифр в номере. При типичных длинах карт (16–19 цифр) влияние на производительность минимально, даже при массовой валидации массивов данных.
Основная нагрузка возникает не на вычислении, а на:
Фактически проверяется только математическая и структурная корректность номера.
В слоях доменной логики декоратор часто применяется на границе системы:
Внутри бизнес-логики данные обычно уже считаются валидными, а @IsCreditCard выполняет роль фильтра первичной очистки входного потока.