Typescript 验证数组包含每个具有特定属性和值的对象中的一个

Typescript 验证数组包含每个具有特定属性和值的对象中的一个,typescript,class-validator,Typescript,Class Validator,我查看了类验证器示例和文档,但找不到我需要的验证 我有一个对象文字数组,每个都有特定的属性和值 const comboItems = [{itemType: 'Entree'}, {itemType: 'Side'}, {itemType: 'Beverage'}]; 我想验证comboItems是否不为空,是否包含3个对象的最小值和最大值,以及是否存在itemType==='Entre',itemType=='Side',itemType=='Beverage' 这是我创建的类,它没有提供正

我查看了类验证器示例和文档,但找不到我需要的验证

我有一个对象文字数组,每个都有特定的属性和值

const comboItems = [{itemType: 'Entree'}, {itemType: 'Side'}, {itemType: 'Beverage'}];
我想验证comboItems是否不为空,是否包含3个对象的最小值和最大值,以及是否存在itemType==='Entre',itemType=='Side',itemType=='Beverage'

这是我创建的类,它没有提供正确的验证:

import {validate, ArrayContains, ArrayNotEmpty, ArrayMinSize, ArrayMaxSize} from 'class-validator';
import { plainToClass } from 'class-transformer';

export class MealMenuItem {
    @ArrayContains([{itemType: 'Entree'}, {itemType: 'Side'}, {itemType: 'Beverage'}])
    @ArrayNotEmpty()
    @ArrayMinSize(3)
    @ArrayMaxSize(3)
    comboItems: any[];
}

const mealMenuItemData: any = {comboItems: [{itemType: 'Entree'}, {itemType: 'Side'}, {itemType: 'Beverage'}]};

const mealMenuItemDataClassInstance = plainToClass(MealMenuItem, mealMenuItemData as MealMenuItem)

validate(mealMenuItemDataClassInstance).then(errors => {
    if (errors.length > 0) 
        console.log('validation failed. errors: ', JSON.stringify(errors));
    else 
        console.log('validation succeed');
});


谢谢你的帮助

由于这行
类验证器
模块,
ArrayContains
装饰器方法只验证
原语
类型:

export function arrayContains(array: unknown, values: any[]): boolean {
  if (!(array instanceof Array)) return false;

  // Here return false for object items
  return values.every(value => array.indexOf(value) !== -1);
}

因此,您可以创建一个自定义装饰器,用于验证
itemType
字段,如下所示:

import {
    validate,
    ArrayMinSize,
    ArrayMaxSize,
    registerDecorator,
    ValidationOptions,
    ValidationArguments
} from 'class-validator';
import { plainToClass } from 'class-transformer';

function ContainSequenceOf(property: string, validationOptions?: ValidationOptions & { containThese: string[] }) {
    return function (object: Object, propertyName: string) {
        registerDecorator({
            name: 'containSequenceOf',
            target: object.constructor,
            propertyName: propertyName,
            constraints: [property],
            options: validationOptions,
            validator: {
                validate(value: any, args: ValidationArguments) {
                    const [relatedPropertyName] = args.constraints;
                    return value.every((item, i) => {
                        return item[relatedPropertyName] === validationOptions?.containThese[i]
                    })
                },
            },
        });
    };
}
export class MealMenuItem {
    @ContainSequenceOf('itemType', {
        message: "Is Not Valid!",
        containThese: ['Entree', 'Side', 'Beverage']
    })
    @ArrayMinSize(3)
    @ArrayMaxSize(3)
    comboItems: any[];
}

const mealMenuItemData: any = {comboItems: [{ itemType: 'Entree' }, { itemType: 'Side' }, { itemType: 'Beverage' }]};
const mealMenuItemDataClassInstance = plainToClass(MealMenuItem, mealMenuItemData as MealMenuItem)

validate(mealMenuItemDataClassInstance).then(errors => {
    if (errors.length > 0) 
        console.log('validation failed. errors: ', JSON.stringify(errors));
    else 
        console.log('validation succeed');
});

此行不是有效的对象=>
const mealMenuItemData:any={comboItems:[{itemType:'Entre',itemType:'Side',itemType:'Beverage'}]}
您应该将其更改为:
const mealMenuItemData:any={comboItems:[{itemType:'entre'},{itemType:'Side'},{itemType:'Beverage'}]}感谢您的反馈。comboItems包含一个对象数组。我还想验证三个对象中的每一个都有一个属性“itemType”,并且您列出的所有值都存在。有没有办法在comboItems上运行一些自定义验证函数?例如:@ArrayContains(reducerValidate)。reducerValidate((curr,acc)=>{const validVals=['entre',Side',Beverage'];validValids.includes(curr['itemType']&&acc.push(curr['itemType']),[])。length==3为避免混淆。comboItems是一个对象数组。我在帖子中更新了代码以反映这一点。如何验证这些对象?