{
"compilerOptions": {
"target": "ES2017",
"experimentalDecorators": true
}
}
function zzz(aaaaaa) {
console.log("==============");
console.log(aaaaaa);
console.log("==============");
}
@zzz
class AppController {}
결과
class decorator는 클래스의 생성자를 유일한 인수로 호출
@ClassDecorator
class A {
b: string = "Hello"
get c(): string {
return `${this.b} World!`
}
d(e: string): void {
console.log(e)
}
}
function ClassDecorator(constructor: typeof A) {
console.log(constructor)
console.log(constructor.prototype)
}
결과
@ClassDecorator
class A {
b: string = "Hello";
get c(): string {
return `${this.b} World!`;
}
d(e: string): void {
console.log(e);
}
}
function ClassDecorator(constructor: typeof A) {
const method = constructor.prototype.d; // 기존의 method
// 기존의 method를 재정의 한다.
constructor.prototype.d = function (e: string) {
method(e); // 기존의 method를 호출하고, 아래를 추가한다.
console.log("d()를 호출하면 이것도 호출된다!");
};
}
new A().d("안녕!");
결과
method decorator는 3가지 argument를 받음
const obj = {};
console.log(typeof obj); // object
// console.log(obj.prototype); // error
const func = function () {};
console.log(func.prototype); // ok
console.log(typeof Object); // function
console.log(Object.prototype); // ok
class A {}
console.log(typeof A); // function
console.log(A.prototype); // ok
method에서 property descriptor
class A {
b: string = "Hello";
get c(): string {
return `${this.b} World!`;
}
@LogError
d(e: string): void {
console.log(e);
}
}
function LogError(target: any, key: string, desc: PropertyDescriptor): void {
console.log("target", target);
console.log("key", key);
console.log("desc", desc);
}
결과
데코레이터 실제 호출한 것
LogError(A.prototype, "d", Object.getOwnPropertyDescriptor(A.prototype, "d")!)
class A {
b: string = "Hello"
get c(): string {
return `${this.b} World!`
}
@LogError
d(e: string): void {
console.log(e)
throw new Error()
}
}
function LogError(target: any, key: string, desc: PropertyDescriptor): void {
const method = desc.value
desc.value = function (e: string) {
try {
method(e)
} catch (err) {
console.log("여기에 error handling logic 추가하면 됨!")
}
}
}
new A().d("안녕!")
결과
class A {
b: string = "Hello"
get c(): string {
return `${this.b} World!`
}
@LogError("ㅎㅎㅎ")
d(e: string): void {
console.log(e)
throw new Error()
}
}
function LogError(errorMessage: string) {
return function (target: any, key: string, desc: PropertyDescriptor): void {
const method = desc.value
desc.value = function (e: string) {
try {
method(e)
} catch (err) {
console.log(errorMessage)
}
}
}
}
new A().d("안녕!")
결과
parameter decoratoreh 3가지 argument를 받음
class A {
b: string = "Hello";
get c(): string {
return `${this.b} World!`;
}
d(
@ParameterDecorator e: string,
@ParameterDecorator f: string,
@ParameterDecorator g: string
): void {
console.log(e, f, g);
}
}
function ParameterDecorator(target: any, key: string, index: number) {
console.log("target", target);
console.log("key", key);
console.log("index", index);
}
결과