Typescript-在构造函数装饰器中调用类方法

时间:2018-07-01 16:15:31

标签: typescript decorator

我有一个带有构造器装饰器的类,该类应用了其他属性。 在这个装饰器中,我通过构造函数原型调用类方法。

function classDecorator(params: any) {
    return function <T extends { new(...args: any[]): {} }>(constructor: T) {
        constructor.prototype.someFunc();

         return class extends constructor {    
            // add new properties...
        } 
    }
}

和班级

@classDecorator("someParams")
class SomeClass {
     someProp: string;
     otherProp: string = "otherProp";

     constructor(val) {
         this.someProp = val;
     }   

     someFunc() {
          console.log(this.someProp);
          console.log(this.otherProp);
     }
}

当我创建此类的实例时:

let obj = new SomeClass("someth");

然后在装饰器内部调用方法“ someFunc()”,但属性“ someProp”和“ otherProp”均未定义。

似乎是因为方法被调用,但属性尚未初始化。

在这种情况下,从构造函数装饰器调用类方法是正确的方法吗?

任何帮助都会很棒。

谢谢。

1 个答案:

答案 0 :(得分:1)

在没有该类实例的情况下声明该类时,装饰器将执行一次。如果要在创建类的实例时访问实例字段/方法,则可以重写构造函数,并在基本构造函数执行后在其中执行代码

function classDecorator(params: any) {
    return function <T extends { new(...args: any[]): { someFunc(): void } }>(constructor: T) {
        return class extends constructor {
            constructor(...args: any[]) {
                super(...args);
                this.someFunc();
            }
        }
    }
}

@classDecorator("someParams")
class SomeClass {
    someProp: string;
    otherProp: string = "otherProp";

    constructor(val) {
        this.someProp = val;
    }   

    someFunc() {
        console.log(this.someProp);
        console.log(this.otherProp);
    }
}

let obj = new SomeClass("someth");