더북(TheBook)

eat, work, sleap 메서드를 startAndEnd 데코레이터가 장식하고 있습니다. eat 메서드를 호출하면 콘솔에 start, Eat, end가 차례로 기록됩니다.

startAndEnd 데코레이터의 선언을 한번 봅시다. originalMethod 매개변수가 eat, work, sleap 같은 기존 메서드입니다. 이 메서드가 대체 메서드(replacementMethod)로 바뀐다고 생각하면 됩니다. replacementMethod에 따라 기존 메서드의 호출 전후로 startend가 로깅됩니다.

현재 데코레이터가 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;
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.