Фото Марка Лішмана на Unsplash
Нещодавно я створював чат-бота для сервісу обміну повідомленнями. Під час розробки цього сервісу я виявив, що багато різних типів повідомлень мають спільний атрибут "type" з попередньо визначеним списком можливих значень.
Щоб зробити мій додаток безпечнішим, я захотів використати пакет NPM class-validator
, щоб забезпечити дотримання правил для атрибутів моїх класів. Це було особливо важливо для забезпечення попередньо заданого списку значень для типів об'єктів повідомлень. Як нам використати декоратор IsEnum
з class-validator
, щоб забезпечити попередньо заданий набір значень атрибутів?
Що таке enum?
Перед тим як реалізувати декоратор IsEnum
, давайте розберемося, що таке enum. Enum — це користувацький тип, що складається з іменованих констант. Вони допомагають забезпечити використання конкретних значень для певного поля.
Припустімо, у нас є клас Shirt
для продукту в нашому магазині одягу. Клас Shirt
може мати атрибут size
, який потрібно керувати. Ми не хочемо, щоб випадкові розміри додавались (що таке "помірно маленька сорочка"?). Enum створює набір можливих значень, і ми не переживаємо про вигадані розміри.
Enum також запобігає використанню непослідовних значень. Хоча значення x-small
, extra-small
, x-s
і X-Small
можуть мати одне й те саме значення, програмісти не хочуть керувати всіма цими варіантами.
З enum ми можемо створити набір чутливих до регістру значень, які може мати атрибут класу. Наш enum для розмірів сорочок може виглядати так:
enum ShirtSize { ‘XS’, ’S’, ‘M’, ‘L’, ‘XL’, XXL’ }
Якщо ми призначимо неправильну змінну або атрибут для цього типу enum, він відкине це значення.
Як використовувати декоратор IsEnum
з class-validator
Тепер, коли ми розібралися, що таке enum, давайте розглянемо, як валідовувати за допомогою IsEnum
з class-validator
. Повторюючи приклад з класом Shirt
з попереднього прикладу, ми можемо отримати такий код класу:
import { IsString, IsNotEmpty, IsNumber } from 'class-validator'
class Shirt {
@IsString()
@IsNotEmpty()
color: string;
@IsNotEmpty()
@IsString()
size: string;
@IsNotEmpty()
@IsNumber()
price: number;
}
У цьому коді наше значення size
є будь-яким рядком. Але це не те, що ми хочемо. Замість цього ми хочемо переконатись, що рядок size
належить до конкретного набору значень. Для цього ми маємо додати декоратор IsEnum
.
Спочатку нам потрібно додати визначення нашого enum. Як тільки ми напишемо наш enum ShirtSize
, ми можемо призначити його атрибуту size
і додати декоратор IsEnum
з одним аргументом нашого enum.
import { IsEnum, IsString, IsNotEmpty, IsNumber } from 'class-validator'
// Шорткод для визначення змінної. Строкові значення такі ж, як
// надані ключі
enum ShirtSize { XS, S, M, L, XL, XXL }
class Shirt {
@IsString()
@IsNotEmpty()
color: string;
@IsNotEmpty()
@IsEnum(ShirtSize)
size: ShirtSize;
@IsNotEmpty()
@IsNumber()
price: number;
}
Перекладено з: [How to use NPM class-validator’s IsEnum to Enforce Class Attribute Values](https://dpericich.medium.com/how-to-use-npm-class-validators-isenum-to-enforce-class-attribute-values-97fecacc0889)