It is possible to do strongly typed validation with class-validator.
This class
enum Color { Red, Green, Blue }
class SomeObject {
string?: string;
}
class Model {
color: Color;
string: string;
number: number;
boolean: boolean;
date: Date;
stringArray: string[];
numberArray: number[];
booleanArray: boolean[];
dateArray: Date[];
enumArray: Color[];
object: SomeObject;
objectArray: SomeObject[];
}
Should decorate like:
enum Color { Red, Green, Blue }
class SomeObject {
@IsOptional()
@IsString()
string?: string;
}
class Model {
@IsEnum(Color)
color: Color;
@IsString()
string: string;
@IsNumber()
number: number;
@IsBoolean()
boolean: boolean;
@IsDate()
date: Date;
@IsString({ each: true })
stringArray: string[];
@IsNumber({},{ each: true })
numberArray: number[];
@IsBoolean({ each: true })
booleanArray: boolean[];
@IsDate({ each: true })
dateArray: Date[];
@IsEnum(Color,{ each: true })
enumArray: Color[];
@ValidateNested()
object: SomeObject;
@ValidateNested({ each: true })
objectArray: SomeObject[];
}
This rule reminds you to add the correct decorator and can fix your models.
npm i tslint-class-validator-rule -D
Add tslint configoration to root of your models folder
{
"rulesDirectory": ["tslint-class-validator-rule"],
"rules": {
"no-property-without-decorator":true
}
}
Fix
tslint -p . --fix
app.useGlobalPipes(new ValidationPipe({ forbidUnknownValues: true }));