Как сказал Тициан, декораторы классов запускаются после декораторов методов, поэтому ваш пример кода console.log(target['property'].text);
терпит неудачу.
Не уверен насчет вашего фактического варианта использования, но если вы можете отложить доступ к target['property']
, у вас не возникнет никаких проблем.
function SomeOtherDecorator(): MethodDecorator {
return (target, propertyKey: string, propertyDescriptor: PropertyDescriptor) => {
const fn = descriptor.value;
// no problem, because `target['property']` is only accessed
// when the decorated method (not decorator) is called.
descriptor.value = (...args) => {
console.log(target['property'].text);
return fn.apply(target, args);
};
}
}
Вы даже можете использовать getter для своего рода ленивого запуска декоратора, следует позаботиться о большинстве случаев использования.
function SomeOtherDecorator(): MethodDecorator {
return (target, propertyKey: string, propertyDescriptor: PropertyDescriptor) => {
const fn = descriptor.value;
let decoratedFn;
descriptor.get = () => {
if (decoratedFn) return decoratedFn;
// do whatever you want to decorate the method/fn
// including access to `target['property']`
decoratedFn = ...
}