Как получить доступ к `this` в методе, добавленном в класс через декоратор в Typescript? - PullRequest
0 голосов
/ 03 октября 2019

Я только начал использовать декораторы в Typescript, и у меня возникают проблемы с добавлением метода в класс.

Как бы вы получили доступ к this в добавленном методе. Например:

const decorator = (target: any): void => {
    target.prototype.doSomething = () => {
        // how can you access the class instance here?
        console.log('in the new method! value =', this.myValue);
    };
};

@decorator
class Something {
    public myValue = 42;
}


const obj = new Something();
obj.doSomething(); // displays in the new method! value = undefined

Я понимаю, что декоратор получает класс в качестве аргумента, и это то, что он модифицирует, поэтому имеет смысл, что экземпляр (который еще не был создан) недоступен. Но в то время, когда метод вызывается, экземпляр существует.

Я прочитал довольно много обсуждений декораторов в сети, и есть много примеров использования console.log, чтобы проиллюстрировать, как работают эти методы. , но я не нашел ни одного, который бы на самом деле ссылался на использование this в методе.

Возможно ли это вообще?

1 Ответ

0 голосов
/ 03 октября 2019

Если вы посмотрите на официальную документацию , вот как должен выглядеть classDecorator:

function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        newProperty = "new property";
        hello = "override";
    }
}

В вашем случае:

function decorator<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        doSomething = function() {
            console.log("Value: " + this.myValue);
        }
    }
}

@decorator
class Something {
    public myValue = 42;

    public doSomething(){}
}


const obj = new Something();
obj.doSomething();

Классопределение будет заменено тем, что возвращено из декоратора, и таким образом ключевое слово "this" будет иметь правильное значение.

Пустая функция doSomething в исходном классе является просто заполнителем, поскольку у машинописного текста есть некоторые проблемы с пониманиемчто класс был изменен после декоратора и даст вам ошибку в последней строке. Посмотрите эту проблему или этот вопрос о стеке для получения дополнительной информации и других возможностей.

...