eat, work, sleap 메서드를 startAndEnd 데코레이터가 장식하고 있습니다. eat 메서드를 호출하면 콘솔에 start, Eat, end가 차례로 기록됩니다.
startAndEnd 데코레이터의 선언을 한번 봅시다. originalMethod 매개변수가 eat, work, sleap 같은 기존 메서드입니다. 이 메서드가 대체 메서드(replacementMethod)로 바뀐다고 생각하면 됩니다. replacementMethod에 따라 기존 메서드의 호출 전후로 start와 end가 로깅됩니다.
현재 데코레이터가 any로 타이핑되어 있는데 제대로 타이핑하면 다음과 같아집니다.
function startAndEnd<This, Args extends any[], Return>(
originalMethod: (this: This, ...args: Args) => Return,
context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>
) {
function replacementMethod(this: This, ...args: Args): Return {
console.log('start');
const result = originalMethod.call(this, ...args);
console.log('end');
return result;
}
return replacementMethod;
}