재학습/NestJS

[NestJS] [데코레이터] 매개변수 데코레이터

재삉 2023. 6. 21. 18:00
반응형

매개변수 데코레이터

  • 생성자 또는 메서드의 매개변수에 선언되어 적용
  • 선언파일 선언클래스에서는 사용될 수 없다
  • 반환값 무시

 

호출시 3개의 인수와 함께 호출됨 

  • 정적멤버가 속한 클래스의 생성자 함수이거나 인스턴스멤버에 대한 클래스의 프로토타입
  • 멤버의 이름
  • 매개변수가 함수에서 몇 번째 위치에 선언되었는지를 나타내는 인덱스

 

구현

import { BadRequestException } from '@nestjs/common';

export class ParameterDecorationTest {
  private name: string;

  @Validate
  setName(@MinLength(3) name: string) {
    this.name = name;
  }
}

function MinLength(min: number) {
  return function (target: any, propertyKey: string, parameterIndex: number) {
    target.validators = {
      minLength: function (args: string[]) {
        return args[parameterIndex].length >= min;
      },
    };
  };
}

function Validate(
  target: any,
  propertyKey: string,
  descriptor: PropertyDescriptor
) {
  const method = descriptor.value;

  descriptor.value = function (...args) {
    Object.keys(target.validators).forEach((key) => {
      if (!target.validators[key](args)) {
        throw new BadRequestException();
      }
    });
    method.apply(this, args);
  };
}

 

parameterDeco(): string {
    const testInstance = new ParameterDecorationTest();
    testInstance.setName('daaa');
    console.log('daaa print');
    console.log('-------');
    testInstance.setName('da');
    console.log('da print');
    return 'parameter decorator test.';
  }

결과

 

즉, 숫자를 파라미터의 길이가 3을 초과하는것은 예외로 잡아낼 수 있다.

반응형