☑️

Class-Validator

2024/08/30に公開

Class-validator

標準搭載されているデコレーターの種類

一般的な検証デコレーター(common)

@IsDefined(value: any)

概要

値が定義されているかどうかを確認する。
(!== undefined, !== null)
これはskipMissingPropertiesオプションを無視する唯一のデコレータです。
Qiitaより
skipMissingProperties: trueに設定すると、バリデータはバリデーションオブジェクトにないすべてのプロパティのバリデーションをスキップします。

引用 - Qiita

デコレータ

@IsDefined(value: any)

コード

IsDefined.ts
export function isDefined<T>(value: T | undefined | null): value is T {
  return value !== undefined && value !== null;
}

GitHub


@IsOptional()

概要

指定された値が空(=== null, === undefined)かどうかを確認し、空の場合は、プロパティのすべてのバリデーション(検証)を無視する。

デコレータ

@IsOptional()

コード

IsOptional.ts
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));
  };
}

GitHub

他のコードと違ってなんのこっちゃって感じかと思います。
constraintsの箇所がキーになっています。
対象のプロパティがnullもしくはundefinedの時はfalse
値がないときは、他のバリデーターチェックを行わないという記述になっています。
値があるときは、他のバリデーターに移すって感じのコードになっています。
少し特殊です。


@Equals(comparison: any)

概要

値が等しいかどうか ("===") 比較してチェックする。

デコレータ

@Equals(comparison: any)

コード

Equals.ts
export function equals(value: unknown, comparison: unknown): boolean {
  return value === comparison;
}

GitHub


@NotEquals(comparison: any)

概要

値が等しくないかどうか("!==")比較をチェックする。

デコレータ

@NotEquals(comparison: any)

コード

NotEquals.ts
export function notEquals(value: unknown, comparison: unknown): boolean {
  return value !== comparison;
}

GitHub


@IsEmpty()

概要

指定された値が空かどうかを確認する。
(=== '', === null, === undefined)

デコレータ

@IsEmpty()

コード

IsEmpty.ts
export function isEmpty(value: unknown): boolean {
  return value === '' || value === null || value === undefined;
}

GitHub


@IsNotEmpty()

概要

指定された値が空でないかどうかを確認する。
(!== '', !== null, !== undefined)

デコレータ

@IsNotEmpty()

コード

IsNotEmpty.ts
export function isNotEmpty(value: unknown): boolean {
  return value !== '' && value !== null && value !== undefined;
}

GitHub


@IsIn(valuse: any[])

概要

値が許可された値の配列内にあるかどうかを確認する。

デコレータ

@IsIn(values: any[])

コード

IsIn.ts
export function isIn(value: unknown, possibleValues: readonly unknown[]): boolean {
  return Array.isArray(possibleValues) && possibleValues.some(possibleValue => possibleValue === value);
}

GitHub


@IsNotIn(values: any[])

概要

値が許可されない値の配列に含まれていないかどうかを確認する。

デコレータ

@IsNotIn(values: any[])

コード

IsNotIn.ts
export function isNotIn(value: unknown, possibleValues: readonly unknown[]): boolean {
  return !Array.isArray(possibleValues) || !possibleValues.some(possibleValue => possibleValue === value);
}

GitHub


型検証デコレータ

@IsBoolean()

概要

値がbooleanかどうかを確認する。

デコレータ

@IsBoolean()

コード

IsBoolean.ts
export function isBoolean(value: unknown): value is boolean {
  return value instanceof Boolean || typeof value === 'boolean';
}

GitHub


@IsDate()

概要

値が日付かどうかを確認する。

デコレータ

@IsDate()

コード

IsDate.ts
export function isDate(value: unknown): value is Date {
  return value instanceof Date && !isNaN(value.getTime());
}

GitHub


@IsString()

概要

値が文字列かどうかを確認する。

デコレータ

@IsString()

コード

IsString.ts
export function isString(value: unknown): value is string {
  return value instanceof String || typeof value === 'string';
}

GitHub


@IsNumber(options: IsNumberOptions)

概要

値が数値かどうかを確認します。

デコレータ

@IsNumber(options: IsNumberOptions)

コード

IsNumber.ts
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);
}

GitHub


@IsInt()

概要

値が整数かどうかを確認する。

デコレータ

@IsInt()

コード

IsInt.ts
export function isInt(val: unknown): val is Number {
  return typeof val === 'number' && Number.isInteger(val);
}

GitHub


@IsArray()

概要

値が配列かどうかを確認する。

デコレータ

@IsArray

コード

IsArray.ts
export function isArray<T = any>(value: unknown): value is Array<T> {
  return Array.isArray(value);
}

GitHub


@IsEnum(entity: object)

概要

値が有効な列挙型であるかどうかを確認する。

デコレータ

@IsEnum(entity: object)

コード

IsEnum.ts
export function isEnum(value: unknown, entity: any): boolean {
  const enumValues = Object.keys(entity).map(k => entity[k]);
  return enumValues.includes(value);
}

GitHub


数値検証デコレータ

@IsDivisibleBy(num: number)

概要

値が別の数値で割切れる数値かどうかを確認する。

デコレータ

@IsDivisibleBy(num: number)

コード

IsDivisibleBy.ts
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);
}

GitHub

引用されてるisDivisibleByValidatorの仕様の確認が出来ていない。
検索結果

ここから先、どうやって確認すれば良いか分かる方はコメント頂けると幸いです。


@IsPositive()

概要

値がゼロより大きい正の数かどうかを確認する。

デコレータ

@IsPositive()

コード

IsPositive.ts
export function isPositive(value: unknown): boolean {
  return typeof value === 'number' && value > 0;
}

GitHub


@IsNegative()

概要

値がゼロより小さい負の数かどうかを確認する。

デコレータ

@IsNegative()

コード

IsNegative.ts
export function isNegative(value: unknown): boolean {
  return typeof value === 'number' && value < 0;
}

GitHub


@Min(min: number)

概要

指定された数値が指定された数値以上であるかどうかを確認する。

デコレータ

@Min(num: number)

コード

Min.ts
export function min(num: unknown, min: number): boolean {
  return typeof num === 'number' && typeof min === 'number' && num >= min;
}

GitHub

条件

  • valuenumberであること
  • min(指定された数字)がnumberであること
  • num >= min であること

@Max(max: number)

概要

指定された数値が指定された数値以下かどうかを確認する。

デコレータ

@Max(num: number)

コード

Max.ts
export function max(num: unknown, max: number): boolean {
  return typeof num === 'number' && typeof max === 'number' && num <= max;
}

GitHub

条件

  • valuenumberであること
  • max(指定された数字)がnumberであること
  • num <= max であること

日付検証デコレータ

@MinDate(date: Date | (() => Date))

概要

値が指定された日付以降の日付であるかどうかを確認します。

デコレータ

@MinDate(date: Date | (() => Date))

コード

MinDate.ts
export function minDate(date: unknown, minDate: Date | (() => Date)): boolean {
  return date instanceof Date && date.getTime() >= (minDate instanceof Date ? minDate : minDate()).getTime();
}

GitHub


@MaxDate(date: Date | (() => Date))

概要

デコレータ

@MaxDate(date: Date | (() => Date))

コード

MaxDate.ts
export function maxDate(date: unknown, maxDate: Date | (() => Date)): boolean {
  return date instanceof Date && date.getTime() <= (maxDate instanceof Date ? maxDate : maxDate()).getTime();
}

GitHub


文字列型検証デコレータ

@IsBooleanString()

概要

文字列がboolean値であるかどうかを確認します。
例: "true", "false"。または、0, 1

デコレータ

@IsBooleanString()

コード

IsBooleanString.ts
export function isBooleanString(value: unknown): boolean {
  return typeof value === 'string' && isBooleanValidator(value);
}

isBooleanValidator(value)の詳細までは不明。
validator/lib/isBooleanより参照。

GitHub


@IsDateString()

概要

@IsISO8601()と同一の確認をする。

デコレータ

@IsDateString()

コード

IsDateString.ts
export function isDateString(value: unknown, options?: ValidatorJS.IsISO8601Options): boolean {
  return isISO8601(value, options);
}

GitHub

isISO8601(value, options)については下記参照
isISO8601.ts


@IsNumberString(options?: IsNumericOptions)

概要

文字列が数値かどうかを確認します。

デコレータ

@IsNumberString(options?: IsNumericOptions)

コード

IsNumberString.ts
export function isNumberString(value: unknown, options?: ValidatorJS.IsNumericOptions): boolean {
  return typeof value === 'string' && isNumericValidator(value, options);
}

GitHub

isNumericValidatorvalidator/lib/isNumeric参照


文字列検証デコレータ

WIP: 多すぎて大変・・・

GitHub

@Is()

概要

デコレータ

@Is

コード


GitHub


配列検証デコレータ

@Is()

概要

デコレータ

@Is

コード


GitHub


@ArrayContains(values: any[])

概要

配列に指定された値の配列のすべての値が含まれているかどうかを確認する。

デコレータ

@ArrayContains(values: any[])

コード

ArrayContains.ts
export function arrayContains(array: unknown, values: any[]): boolean {
  if (!Array.isArray(array)) return false;

  return values.every(value => array.indexOf(value) !== -1);
}

GitHub


@ArrayNotContains(values: any[])

概要

配列に指定された値が含まれていないかどうかを確認する。

デコレータ

@ArrayNotContains(values: any[])

コード

ArrayNotContains
export function arrayNotContains(array: unknown, values: any[]): boolean {
  if (!Array.isArray(array)) return false;

  return values.every(value => array.indexOf(value) === -1);
}

GitHub


@ArrayNotEmpty()

概要

指定された配列が空でないかどうかを確認する。

デコレータ

@ArrayNotEmpty()

コード

ArrayNotEmpty
export function arrayNotEmpty(array: unknown): boolean {
  return Array.isArray(array) && array.length > 0;
}

GitHub


@ArrayMinSize(min: number)

概要

配列の長さが指定された数以上であるかどうかを確認する。

デコレータ

@ArrayMinSize(min: number)

コード

ArrayMinSize.ts
export function arrayMinSize(array: unknown, min: number): boolean {
  return Array.isArray(array) && array.length >= min;
}

GitHub


@ArrayMaxSize(max: number)

概要

配列の長さが指定された数以下かどうかを確認する。

デコレータ

@ArrayMaxSize(max: number)

コード

ArrayMaxSize.ts
export function arrayMaxSize(array: unknown, max: number): boolean {
  return Array.isArray(array) && array.length <= max;
}

GitHub


@ArrayUnique(identifier?: (o) => any)

概要

すべての配列の値が一意であるかどうかを確認する。
オブジェクトの比較は参照ベースで行われる。
比較に使用される戻り値をオプションで指定できる。

デコレータ

@ArrayUnique(identifier?: (o) => any)

コード

ArrayUnique.ts
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;
}

GitHub


オブジェクト検証デコレータ

@IsInstance(value: any)

概要

プロパティが渡された値のインスタンスであるかどうかを確認します。

デコレータ

@IsInstance(value: any)

コード

IsInstance.ts
export function isInstance(object: unknown, targetTypeConstructor: new (...args: any[]) => any): boolean {
  return (
    targetTypeConstructor && typeof targetTypeConstructor === 'function' && object instanceof targetTypeConstructor
  );
}

GitHub


その他のデコレータ

@Allow()

概要

他の制約が指定されていない場合にプロパティが削除されるのを防ぎます。

デコレータ

@Allow()

コード

Allow.ts
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));
  };
}

GitHub

上手く掘り下げれてない
アローなので許可的な意味合いかなと


サンプル

公式Docサンプル

Discussion