首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用类验证器验证Record<string,string[]>

使用类验证器验证Record<string,string[]>
EN

Stack Overflow用户
提问于 2022-09-30 07:32:17
回答 1查看 103关注 0票数 0

我正在尝试验证Record,但它不起作用。

这是我的定制装潢师的样子

代码语言:javascript
复制
import {
  isObject,
  registerDecorator,
  ValidationArguments,
  ValidationOptions,
} from 'class-validator';

export const IsRecord = (
  key_validators: ((value: string) => boolean)[],
  value_validators: ((value: string[]) => boolean)[],
  validationOptions?: ValidationOptions,
) => {
  return function (object: unknown, propertyName: string) {
    registerDecorator({
      name: 'IsRecord',
      target: (object as any).constructor,
      propertyName: propertyName,
      options: validationOptions,
      validator: {
        validate(value: unknown, args: ValidationArguments) {
          if (!isObject(value)) return false;
          const keys = Object.keys(value);

          return keys.some(key => {
            // eslint-disable-next-line @typescript-eslint/naming-convention
            const is_key_invalid = key_validators.some(
              validator => !validator(key),
            );
            if (is_key_invalid) return false;

            // eslint-disable-next-line @typescript-eslint/ban-ts-comment
            // @ts-ignore
            return value_validators.some(validator => !validator(value[key]));
          });
        },
      },
    });
  };
};

我将在我的控制器中使用这个AutoRegisterDto来指定身体类型。

代码语言:javascript
复制
import {
  BaseRole,
  ModuleName,
  Topic,
} from 'my-package';
import { IsBoolean, IsEnum, IsObject, IsOptional } from 'class-validator';
import { IsRecord } from './decorators/is-record.decorator';

export class AutoRegisterDto {
  @IsEnum(ModuleName)
  name: ModuleName;

  @IsBoolean()
  isEnabled: boolean;

  @IsObject()
  @IsOptional()
  @IsRecord([], [])
  actions: Record<Topic, BaseRole[]>;
}

BaseRole Enum

代码语言:javascript
复制
export declare enum BaseRole {
    UNREGISTERED_GUEST = "unregistered_user",
    UNVERIFIED_GUEST = "unverified_guest",
    VERIFIED_GUEST = "verified_guest",
    STUDENT = "student",
    EMPLOYEE = "employee",
    ADMIN = "admin"
}

和主题

代码语言:javascript
复制
export declare type Topic = string;

我试着按照这个question的答案来解决这个问题,但是它对我不起作用。

(预先谢谢)

EN

回答 1

Stack Overflow用户

发布于 2022-10-03 04:45:32

最后我以这种方式解决了我的问题,我仔细阅读了类验证器的文档。

代码语言:javascript
复制
export const IsRecord = (validationOptions?: ValidationOptions) => {
  return function (object: unknown, propertyName: string) {
    registerDecorator({
      name: 'IsRecord',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [],
      options: {
        message: 'Wrong object format',
        ...validationOptions,
      },
      validator: {
        validate(value: unknown, args: ValidationArguments) {
          if (!isObject(value)) return false;
          if (Object.keys(value).length === 0) return true;
          const keys = Object.keys(value);

          return keys.every(key => {
            if (typeof key != 'string') return false;

            return Array.isArray(value[key]) && value[key].every(val => Object.values(BaseRole).includes(val));
          });
        },
      },
    });
  };
};

这将验证空对象或具有字符串类型的键和枚举BaseRole的值数组的对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73905403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档