TS의 데커레이터는 자바에서 애너테이션이랑 비슷하다.
클래스, 메서드, 접근자, 프로퍼티, 매개변수에 적용 가능
사용자가 요청을 잘못 보낼 때, 네스트에서는 @데커레이터
로 허용하는 값으로 보냈는지 검사한다.
class CreateUserDto {
@IsEmail()
@MaxLength(60)
readonly email: string;
@IsString()
@Matches(/^[A-Za-z\d!@#$%^&*()]{8,30}$/)
readonly password: string;
}
위 예시를 모면 이메일인지 아닌지 길이는 60자 이하로 검사하고
정규표현식에 적합한 string인지 검사한다.
tsconfig.json에서 experimentalDecorators 옵션이 true로 설정되야 사용 가능하다
데커레이터는 @deco
이런 식으로 사용하는데,
deco는 데커레이팅된 선언에 대한 정보랑 같이 호출되는 함수다.
예를 들어보면
타입스크립트에서 지원하는 데커레이터는 총 5가지가 있다.
클래스의 바로 앞에 선언되며, 생성자에 적용돼서 클래스 정의를 읽고 수정이 가능하다.
선언파일과 선언 클래스 안에는 사용할 수 없다.
// 클레스 데터레이터 팩터리
function classDecorator <T extends { new (...args: any[]): {} }> (constructor: T) {
// 클래스데터레이터는 생성자를 리턴하는 함수다.
return class extends constructor {
reportingURL = 'http://www.ex.com';
}
}
@classDecorator
class Report {
type = 'report';
title: string;
constructor(t: string) {
this.title = t
}
}
const a = new Report('hello report')
console.log(a);
클래스 데커레이터는 생성자를 리턴하는 함수다.
위 클래스 데터레이터 팩터리는 생성자 타입을 (new (...args: any[]): {}) 상속받는 제네릭 타입 T를 가지는 생성자를 메서드의 인수로 전달한다.
이는 new키워드와 함께 어떤 형식의 인수들도 받을 수 있는 타입이다.
클래스 데커레이터가 적용되는 클래스는 reportingURL을 속성에 추가한다.
위 예시의 출력결과는
{type: 'report', title: 'hello report', reportingURL: 'http://www.ex.com'}
으로 선언되지 않은 속성이 추가된다.
메서드 바로 앞에 선언.
메서드의 속성 프로퍼티에 적용되며, 메서드를 읽고 수정가능
메서드 데커레이터는 3개의 인수를 가진다.
매개변수 데커레이터는 생성자, 메서드의 파라미터에 적용된다.
호출 시 3가지 인수랑 같이 호출되는데, 반환값은 무시한다.
선언 파일이나 클래스에는 사용못함.