When I define a parameterized decorator for the method, the decorator starts running before the method runs.
I want the decorator to run after the method is called.
function fooDecorator(value: boolean) {
console.log('fooDecorator init');
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
};
}
class Foo{
@fooDecorator(true)
foo(){
}
}
app.listen(5000, () => console.log("server started"));
// Output
fooDecoratorinit
server started
TypeScript method decorators run during class initialization, so they can decorate the method; see the documentation. If you want a decorator to do something when the method is called, you have the decorator wrap the method in another function that does the thing you want it to do:
function fooDecorator(flag: boolean) {
return function (target: any, propertyKey: string; descriptor: PropertyDescriptor) {
const original = target[propertyKey];
return {
...descriptor,
value(...args: any[]) {
console.log("Inserted behavior, flag = " + flag);
return original.apply(this, args);
}
}
};
}
class Foo{
@fooDecorator(true)
foo(){
console.log("Original foo");
}
}
const f = new Foo();
f.foo();
Output:
Inserted behavior, flag = true Original foo