使用类验证器验证字符串文字类型

Rad*_*tem 13 typescript class-validator

我有这种类型:

export type BranchOperatorRole = 'none' | 'seller' | 'operator' | 'administrator';
Run Code Online (Sandbox Code Playgroud)

我可以使用哪个类验证器装饰器来验证属性是否具有这些值之一?

import { IsEmail, IsString, Contains } from "class-validator";

export type BranchOperatorRole = 'none' | 'seller' | 'operator' | 'administrator';

export class AddBranchOperatorRequest extends User {

    @IsEmail()
    email: string;

    @Contains(BranchOperatorRole )
    role: BranchOperatorRole;

}

Run Code Online (Sandbox Code Playgroud)

Yev*_*nii 12

您无法按类型进行验证,因为类型在运行时消失。您可以创建枚举并使用IsEnum装饰器进行验证。例子

在你的情况下尝试这样的事情:

export enum BranchOperatorRoleEnum = {
  none=1,
  seller=2,
  // other
}

class AddBranchOperatorRequest {
    @IsEnum(BranchOperatorRoleEnum)
    role: BranchOperatorRole;
}
Run Code Online (Sandbox Code Playgroud)

或者甚至用数组代替枚举

export type BranchOperatorRole = 'none' | 'seller' | 'operator' | 'administrator';

export const BranchOperatorRoles: BranchOperatorRole[] = [
  'none',
  'seller',
  // other
]

class AddBranchOperatorRequest {
    @IsEnum(BranchOperatorRoles)
    role: BranchOperatorRole;
}
Run Code Online (Sandbox Code Playgroud)

  • 有点你把你的代码加倍了。将硬编码值加倍。一定会有更好的办法。我相信! (2认同)

小智 12

const roles = ['none', 'seller', 'operator', 'administrator'] as const;
export type BranchOperatorRole = typeof roles[number];

export class AddBranchOperatorRequest extends User {

    @IsEmail()
    email: string;

    @IsIn(roles)
    role: BranchOperatorRole;

}
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以解决问题,但[包括解释](//meta.stackexchange.com/q/114762) 如何以及为何解决问题确实有助于提高帖子的质量,并可能会带来更多结果赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 (4认同)