Class-Validator
Class-validator
一般的な検証デコレーター(common)
@IsDefined(value: any)
概要
値が定義されているかどうかを確認する。
(!== undefined, !== null)
これはskipMissingPropertiesオプションを無視する唯一のデコレータです。
Qiitaより
skipMissingProperties
: trueに設定すると、バリデータはバリデーションオブジェクトにないすべてのプロパティのバリデーションをスキップします。
デコレータ
@IsDefined(value: any)
コード
export function isDefined<T>(value: T | undefined | null): value is T {
return value !== undefined && value !== null;
}
@IsOptional()
概要
指定された値が空(=== null, === undefined)かどうかを確認し、空の場合は、プロパティのすべてのバリデーション(検証)を無視する。
デコレータ
@IsOptional()
コード
export function IsOptional(validationOptions?: ValidationOptions): PropertyDecorator {
// デコレーター関数を返す。この関数は、クラスのプロパティに適用される。
return function (object: object, propertyName: string): void {
// ValidationMetadataArgsというインターフェースに従って、バリデーションのメタデータを定義する。
const args: ValidationMetadataArgs = {
// バリデーションのタイプをCONDITIONAL_VALIDATION(条件付きバリデーション)として指定。
type: ValidationTypes.CONDITIONAL_VALIDATION,
// バリデーションの名前をIS_OPTIONALとして設定。これは内部で使用される定数。
name: IS_OPTIONAL,
// バリデーションが適用されるクラス(target)とプロパティ名を指定。
target: object.constructor,
propertyName: propertyName,
// オプショナルかどうかをチェックする条件をconstraintsとして定義。
constraints: [
// プロパティの値がnullでもundefinedでもない場合にtrueを返す関数を指定。
(object: any, value: any): boolean => {
return object[propertyName] !== null && object[propertyName] !== undefined;
},
],
// 任意のバリデーションオプションを設定。
validationOptions: validationOptions,
};
// 生成したメタデータをストレージに保存する。
getMetadataStorage().addValidationMetadata(new ValidationMetadata(args));
};
}
他のコードと違ってなんのこっちゃって感じかと思います。
constraints
の箇所がキーになっています。
対象のプロパティがnullもしくはundefinedの時はfalse
値がないときは、他のバリデーターチェックを行わないという記述になっています。
値があるときは、他のバリデーターに移すって感じのコードになっています。
少し特殊です。
@Equals(comparison: any)
概要
値が等しいかどうか ("===") 比較してチェックする。
デコレータ
@Equals(comparison: any)
コード
export function equals(value: unknown, comparison: unknown): boolean {
return value === comparison;
}
@NotEquals(comparison: any)
概要
値が等しくないかどうか("!==")比較をチェックする。
デコレータ
@NotEquals(comparison: any)
コード
export function notEquals(value: unknown, comparison: unknown): boolean {
return value !== comparison;
}
@IsEmpty()
概要
指定された値が空かどうかを確認する。
(=== '', === null, === undefined)
デコレータ
@IsEmpty()
コード
export function isEmpty(value: unknown): boolean {
return value === '' || value === null || value === undefined;
}
@IsNotEmpty()
概要
指定された値が空でないかどうかを確認する。
(!== '', !== null, !== undefined)
デコレータ
@IsNotEmpty()
コード
export function isNotEmpty(value: unknown): boolean {
return value !== '' && value !== null && value !== undefined;
}
@IsIn(valuse: any[])
概要
値が許可された値の配列内にあるかどうかを確認する。
デコレータ
@IsIn(values: any[])
コード
export function isIn(value: unknown, possibleValues: readonly unknown[]): boolean {
return Array.isArray(possibleValues) && possibleValues.some(possibleValue => possibleValue === value);
}
@IsNotIn(values: any[])
概要
値が許可されない値の配列に含まれていないかどうかを確認する。
デコレータ
@IsNotIn(values: any[])
コード
export function isNotIn(value: unknown, possibleValues: readonly unknown[]): boolean {
return !Array.isArray(possibleValues) || !possibleValues.some(possibleValue => possibleValue === value);
}
型検証デコレータ
@IsBoolean()
概要
値がbooleanかどうかを確認する。
デコレータ
@IsBoolean()
コード
export function isBoolean(value: unknown): value is boolean {
return value instanceof Boolean || typeof value === 'boolean';
}
@IsDate()
概要
値が日付かどうかを確認する。
デコレータ
@IsDate()
コード
export function isDate(value: unknown): value is Date {
return value instanceof Date && !isNaN(value.getTime());
}
@IsString()
概要
値が文字列かどうかを確認する。
デコレータ
@IsString()
コード
export function isString(value: unknown): value is string {
return value instanceof String || typeof value === 'string';
}
@IsNumber(options: IsNumberOptions)
概要
値が数値かどうかを確認します。
デコレータ
@IsNumber(options: IsNumberOptions)
コード
export interface IsNumberOptions {
allowNaN?: boolean;
allowInfinity?: boolean;
maxDecimalPlaces?: number;
}
export function isNumber(value: unknown, options: IsNumberOptions = {}): value is number {
if (typeof value !== 'number') {
return false;
}
if (value === Infinity || value === -Infinity) {
return !!options.allowInfinity;
}
if (Number.isNaN(value)) {
return !!options.allowNaN;
}
if (options.maxDecimalPlaces !== undefined) {
let decimalPlaces = 0;
if (value % 1 !== 0) {
decimalPlaces = value.toString().split('.')[1].length;
}
if (decimalPlaces > options.maxDecimalPlaces) {
return false;
}
}
return Number.isFinite(value);
}
@IsInt()
概要
値が整数かどうかを確認する。
デコレータ
@IsInt()
コード
export function isInt(val: unknown): val is Number {
return typeof val === 'number' && Number.isInteger(val);
}
@IsArray()
概要
値が配列かどうかを確認する。
デコレータ
@IsArray
コード
export function isArray<T = any>(value: unknown): value is Array<T> {
return Array.isArray(value);
}
@IsEnum(entity: object)
概要
値が有効な列挙型であるかどうかを確認する。
デコレータ
@IsEnum(entity: object)
コード
export function isEnum(value: unknown, entity: any): boolean {
const enumValues = Object.keys(entity).map(k => entity[k]);
return enumValues.includes(value);
}
数値検証デコレータ
@IsDivisibleBy(num: number)
概要
値が別の数値で割切れる数値かどうかを確認する。
デコレータ
@IsDivisibleBy(num: number)
コード
import isDivisibleByValidator from 'validator/lib/isDivisibleBy';
export function isDivisibleBy(value: unknown, num: number): boolean {
return typeof value === 'number' && typeof num === 'number' && isDivisibleByValidator(String(value), num);
}
引用されてるisDivisibleByValidator
の仕様の確認が出来ていない。
検索結果
ここから先、どうやって確認すれば良いか分かる方はコメント頂けると幸いです。
@IsPositive()
概要
値がゼロより大きい正の数かどうかを確認する。
デコレータ
@IsPositive()
コード
export function isPositive(value: unknown): boolean {
return typeof value === 'number' && value > 0;
}
@IsNegative()
概要
値がゼロより小さい負の数かどうかを確認する。
デコレータ
@IsNegative()
コード
export function isNegative(value: unknown): boolean {
return typeof value === 'number' && value < 0;
}
@Min(min: number)
概要
指定された数値が指定された数値以上であるかどうかを確認する。
デコレータ
@Min(num: number)
コード
export function min(num: unknown, min: number): boolean {
return typeof num === 'number' && typeof min === 'number' && num >= min;
}
条件
-
value
がnumber
であること -
min
(指定された数字)がnumber
であること -
num >= min
であること
@Max(max: number)
概要
指定された数値が指定された数値以下かどうかを確認する。
デコレータ
@Max(num: number)
コード
export function max(num: unknown, max: number): boolean {
return typeof num === 'number' && typeof max === 'number' && num <= max;
}
条件
-
value
がnumber
であること -
max
(指定された数字)がnumber
であること -
num <= max
であること
日付検証デコレータ
@MinDate(date: Date | (() => Date))
概要
値が指定された日付以降の日付であるかどうかを確認します。
デコレータ
@MinDate(date: Date | (() => Date))
コード
export function minDate(date: unknown, minDate: Date | (() => Date)): boolean {
return date instanceof Date && date.getTime() >= (minDate instanceof Date ? minDate : minDate()).getTime();
}
@MaxDate(date: Date | (() => Date))
概要
デコレータ
@MaxDate(date: Date | (() => Date))
コード
export function maxDate(date: unknown, maxDate: Date | (() => Date)): boolean {
return date instanceof Date && date.getTime() <= (maxDate instanceof Date ? maxDate : maxDate()).getTime();
}
文字列型検証デコレータ
@IsBooleanString()
概要
文字列がboolean値であるかどうかを確認します。
例: "true"
, "false"
。または、0
, 1
デコレータ
@IsBooleanString()
コード
export function isBooleanString(value: unknown): boolean {
return typeof value === 'string' && isBooleanValidator(value);
}
isBooleanValidator(value)
の詳細までは不明。
validator/lib/isBoolean
より参照。
@IsDateString()
概要
@IsISO8601()と同一の確認をする。
デコレータ
@IsDateString()
コード
export function isDateString(value: unknown, options?: ValidatorJS.IsISO8601Options): boolean {
return isISO8601(value, options);
}
isISO8601(value, options)
については下記参照
isISO8601.ts
@IsNumberString(options?: IsNumericOptions)
概要
文字列が数値かどうかを確認します。
デコレータ
@IsNumberString(options?: IsNumericOptions)
コード
export function isNumberString(value: unknown, options?: ValidatorJS.IsNumericOptions): boolean {
return typeof value === 'string' && isNumericValidator(value, options);
}
isNumericValidator
はvalidator/lib/isNumeric
参照
文字列検証デコレータ
WIP: 多すぎて大変・・・
@Is()
概要
デコレータ
@Is
コード
配列検証デコレータ
@Is()
概要
デコレータ
@Is
コード
@ArrayContains(values: any[])
概要
配列に指定された値の配列のすべての値が含まれているかどうかを確認する。
デコレータ
@ArrayContains(values: any[])
コード
export function arrayContains(array: unknown, values: any[]): boolean {
if (!Array.isArray(array)) return false;
return values.every(value => array.indexOf(value) !== -1);
}
@ArrayNotContains(values: any[])
概要
配列に指定された値が含まれていないかどうかを確認する。
デコレータ
@ArrayNotContains(values: any[])
コード
export function arrayNotContains(array: unknown, values: any[]): boolean {
if (!Array.isArray(array)) return false;
return values.every(value => array.indexOf(value) === -1);
}
@ArrayNotEmpty()
概要
指定された配列が空でないかどうかを確認する。
デコレータ
@ArrayNotEmpty()
コード
export function arrayNotEmpty(array: unknown): boolean {
return Array.isArray(array) && array.length > 0;
}
@ArrayMinSize(min: number)
概要
配列の長さが指定された数以上であるかどうかを確認する。
デコレータ
@ArrayMinSize(min: number)
コード
export function arrayMinSize(array: unknown, min: number): boolean {
return Array.isArray(array) && array.length >= min;
}
@ArrayMaxSize(max: number)
概要
配列の長さが指定された数以下かどうかを確認する。
デコレータ
@ArrayMaxSize(max: number)
コード
export function arrayMaxSize(array: unknown, max: number): boolean {
return Array.isArray(array) && array.length <= max;
}
@ArrayUnique(identifier?: (o) => any)
概要
すべての配列の値が一意であるかどうかを確認する。
オブジェクトの比較は参照ベースで行われる。
比較に使用される戻り値をオプションで指定できる。
デコレータ
@ArrayUnique(identifier?: (o) => any)
コード
export function arrayUnique(array: unknown[], identifier?: ArrayUniqueIdentifier): boolean {
if (!Array.isArray(array)) return false;
if (identifier) {
array = array.map(o => (o != null ? identifier(o) : o));
}
const uniqueItems = array.filter((a, b, c) => c.indexOf(a) === b);
return array.length === uniqueItems.length;
}
オブジェクト検証デコレータ
@IsInstance(value: any)
概要
プロパティが渡された値のインスタンスであるかどうかを確認します。
デコレータ
@IsInstance(value: any)
コード
export function isInstance(object: unknown, targetTypeConstructor: new (...args: any[]) => any): boolean {
return (
targetTypeConstructor && typeof targetTypeConstructor === 'function' && object instanceof targetTypeConstructor
);
}
その他のデコレータ
@Allow()
概要
他の制約が指定されていない場合にプロパティが削除されるのを防ぎます。
デコレータ
@Allow()
コード
export function Allow(validationOptions?: ValidationOptions): PropertyDecorator {
return function (object: object, propertyName: string): void {
const args: ValidationMetadataArgs = {
type: ValidationTypes.WHITELIST,
target: object.constructor,
propertyName: propertyName,
validationOptions: validationOptions,
};
getMetadataStorage().addValidationMetadata(new ValidationMetadata(args));
};
}
上手く掘り下げれてない
アローなので許可的な意味合いかなと
Discussion