通常我会像这样应用装饰器:
getSupportActionBar()
还有一些方法可以将它用于普通对象而不是类:
class SpecialMethods {
@Deco
static someMethod() {
}
}
答案 0 :(得分:5)
是的,但不太实际。您可以为对象的属性调用装饰器,但不能像装饰类及其内容一样。
鉴于以下装饰者:
const TestDecorator = (at: string) => {
return function (target: any, prop: string, descriptor?: PropertyDescriptor) {
console.log(`decorated at ${at}}`);
}
}
将在课程中使用:
class TestClass {
@TestDecorator('class method')
public testMethod() { }
}
但是,它不能以与上述相同的方式应用于属性:
const testObj = {
@TestDecorator('property method')
testMethod: () => { }
};
要解决此问题,您可以在属性中调用装饰器。
首先,您必须使用其所有属性声明对象:
const testObj = {
testMethod: () => { }
};
我的装饰师期待一个咖喱价值:
const deco = TestDecorator('property method');
现在您必须在deco
中手动调用该属性的testObj
装饰器:
deco(testObj, 'testMethod');
如果您需要装饰器中的propertyDescriptor
(它不在OP中),您也必须手动提供它:
deco(testObj, 'testMethod', Object.getOwnPropertyDescriptor(testObj, 'testMethod'));
这是TS playground。检查控制台中的输出。