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是一个对象数组。我在帖子中更新了代码以反映这一点。如何验证这些对象?