В TypeScript класс-валидатор — это популярная библиотека, используемая для проверки объектов и их свойств. Массивы перечислений, которые представляют собой массивы, содержащие значения из перечисления, обычно используются в приложениях TypeScript. В этой статье мы рассмотрим различные методы проверки массивов перечислений с использованием библиотеки проверки классов, а также примеры кода.
Метод 1: использование декоратора «IsEnum».
Декоратор «IsEnum», предоставляемый классом-валидатором, позволяет нам проверить, принадлежит ли каждое значение в массиве указанному перечислению. Вот пример:
import { IsEnum, validateSync } from 'class-validator';
enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue',
}
class Colors {
@IsEnum(Color, { each: true })
values: Color[];
}
const colors = new Colors();
colors.values = [Color.Red, Color.Blue, 'invalid']; // 'invalid' is not a valid enum value
const errors = validateSync(colors);
console.log(errors); // [ { target: Colors { values: [ 'invalid' ] }, property: 'values', constraints: { isEnum: 'values must be a valid enum value' } } ]
Метод 2: использование специального декоратора проверки
Если вам требуется более сложная логика проверки для массивов перечислений, вы можете создать собственный декоратор. Вот пример:
import { validateSync, registerDecorator, ValidationOptions } from 'class-validator';
enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue',
}
function IsEnumArray(enumType: any, validationOptions?: ValidationOptions) {
return function (object: Record<string, any>, propertyName: string) {
registerDecorator({
name: 'isEnumArray',
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
validator: {
validate(value: any) {
if (!Array.isArray(value)) {
return false;
}
for (const enumValue of value) {
if (!Object.values(enumType).includes(enumValue)) {
return false;
}
}
return true;
},
},
});
};
}
class Colors {
@IsEnumArray(Color)
values: Color[];
}
const colors = new Colors();
colors.values = [Color.Red, Color.Blue, 'invalid']; // 'invalid' is not a valid enum value
const errors = validateSync(colors);
console.log(errors); // [ { target: Colors { values: [ 'invalid' ] }, property: 'values', constraints: { isEnumArray: 'values must be a valid enum array' } } ]
Метод 3: использование пользовательской функции проверки
В качестве альтернативы вы можете определить отдельную функцию проверки для проверки массива перечислений. Вот пример:
import { validateSync } from 'class-validator';
enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue',
}
function validateEnumArray(value: any[], enumType: any): boolean {
if (!Array.isArray(value)) {
return false;
}
for (const enumValue of value) {
if (!Object.values(enumType).includes(enumValue)) {
return false;
}
}
return true;
}
class Colors {
values: Color[];
validate() {
return validateEnumArray(this.values, Color);
}
}
const colors = new Colors();
colors.values = [Color.Red, Color.Blue, 'invalid']; // 'invalid' is not a valid enum value
const isValid = colors.validate();
console.log(isValid); // false
В этой статье мы рассмотрели три различных метода проверки массивов перечислений с использованием библиотеки проверки классов в TypeScript. Первый метод использует встроенный декоратор IsEnum, а два других метода включают создание пользовательских декораторов или функций проверки. Эти методы обеспечивают гибкость при проверке массивов перечислений на основе конкретных требований ваших приложений TypeScript.
Используя эти методы, вы можете гарантировать, что ваши массивы перечислений проверены правильно, что помогает поддерживать целостность данных и предотвращает потенциальные ошибки.