Is there any reason it behaves like that? function TestC(target: Function, context: ClassDecoratorContext) { console.log("constructor"); } function TestM(target: Function, context: ClassMethodDecoratorContext) { console.log("method"); } @TestC class Foo { @TestM greet(name: string) { console.log("Hello ", name); } } const f = new Foo(); f.greet("Toto"); // Logs: // method // constructor // Hello Toto This is very annoying, I would've liked to do something like this function TestC(target: Function, context: ClassDecoratorContext) { target.prototype.bar = 0; } function TestM(target: Function, context: ClassMethodDecoratorContext) { context.addInitializer(function(this: any) { this.bar++; }); } @TestC class Foo { @TestM greet() { // is never called } } const f = new Foo(); console.log(f.bar); // Logs undefined submitted by /u/masar314 [link] [comments]