Typescript - вызов методов класса внутри конструктора-декоратора - PullRequest
0 голосов
/ 01 июля 2018

У меня есть класс с конструктором декоратора, который применяет дополнительные свойства. В этом декораторе я вызываю метод класса через прототип конструктора.

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 голосов
/ 01 июля 2018

Декоратор выполняется один раз, когда класс объявляется, когда не существует экземпляра класса. Если вы хотите получить доступ к полям / методам экземпляра при создании экземпляра класса, вы можете переопределить конструктор и выполнить код там после выполнения базового конструктора

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");
...