Radecom System
Radecom System

Reputation: 252

Validating String Literal Type with class-validator

I have this type:

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

With which class-validator decorator can I validate that a property has one of those values?

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;

}

Upvotes: 17

Views: 24158

Answers (2)

Nikita
Nikita

Reputation: 171

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;

}

Upvotes: 17

Yevhenii
Yevhenii

Reputation: 1703

You can't validate by type since Types disappears in runtime. You can create Enum and use IsEnum decorator for validation. Example

In your case try something like this:

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

class AddBranchOperatorRequest {
    @IsEnum(BranchOperatorRoleEnum)
    role: BranchOperatorRole;
}

Or even with array instead of enum

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

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

class AddBranchOperatorRequest {
    @IsEnum(BranchOperatorRoles)
    role: BranchOperatorRole;
}

Upvotes: 13

Related Questions