我有一个带有构造器装饰器的类,该类应用了其他属性。 在这个装饰器中,我通过构造函数原型调用类方法。
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”均未定义。
似乎是因为方法被调用,但属性尚未初始化。
在这种情况下,从构造函数装饰器调用类方法是正确的方法吗?
任何帮助都会很棒。
谢谢。
答案 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");