TypeScript class decorator that modifies object instance
Why not just assign those properties to the prototype, and subsequently assign to the instance on first invocation
// decoratorfunction addAndCall(cb: Function, newField: string) { // cb is now available in the decorator return function(ctor: Function): void { Object.defineProperty(ctor.prototype, newField, { value: function(...args: any[]) { return Object.defineProperty(this, newField, { value: function(...args: any[]) { console.log(newField, ...args); } })[newField](...args); } }); cb(ctor); }}let callMe = (decoratedCtor) => console.log(decoratedCtor);@addAndCall(callMe, 'propertyName')class AddToMe {}let addToMe = new AddToMe();(<any>addToMe).propertyName(1, 2);
Here's a working version:
function addAndCall(target: any) { var original = target; function construct(constructor, args) { var c: any = function () { this.newAttribute = "object instance value"; ExternalModule.externalFunction(this); return constructor.apply(this, args);; } c.prototype = constructor.prototype; return new c(); } var f: any = function (...args) { return construct(original, args); } f.prototype = original.prototype; return f;}