export default class GeneralController {
@OverrideCtx // 사용할 데코레이터
public static async helloWorld(ctx: ApiContext, next: any) {
ctx.body = "Hello World";
//@ts-ignore // ApiContext 타입에도 check()를 넣어주면 필요 없어짐
ctx.check(); // 파라미터 객체에 추가할 함수
}
}
descriptor.value
에 접근하여, 함수 정보를 덮어 씌워 버린다.
덮어 씌우는 함수 내에서 함수의 파라미터에 접근할 수 있다.
async 함수인 경우, 아래와 같이 await
를 통해 .call()
을 대기해야 한다.
아래는 첫 번째 파라미터인 ctx
객체에 check()
함수를 강제로 주입하는 예제
(유사 확장 메소드 구현)
아래 예제처럼 함수를 주입하면서, 실제 사용될 타입 ApiContext
에 check
함수를 같이 넣어주면 //@ts-ignore
없이 실제로 호출하여 사용할 수 있다.
(ApiContext
타입이 type
이 아니라 interface
인 경우, 손쉽게 함수 추가 가능)
function OverrideCtx(target: any, name: string, descriptor: PropertyDescriptor) {
const prevDesc = descriptor.value;
descriptor.value = async function (ctx: any, next: any) {
// Overrides //
ctx.__proto__.check = function () {
console.log('CHECK');
}
await prevDesc.call(this, ctx, next);
}
}