我想创建一个可以应用于方法的装饰器, 它的目标是控制是否允许您运行某种方法。 这意味着它应该具有某种条件,如果它通过它将像往常一样运行(在相同的上下文中)
以下是我拍摄的照片,但由于私人会员 失败,现在我无法访问该功能:
return function(target:any, propertyKey: string, descriptor: PropertyDescriptor){
var funcToRun = descriptor.value;
descriptor.value = () => {
if(true) { //if has permissions
return p.call(target);
}
}
}
提前致谢。
答案 0 :(得分:3)
我不会更改传递的描述符,而是返回更改的副本。
以下是您要求的工作版本:
function deco(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const newDescriptor = Object.assign({}, descriptor);
newDescriptor.value = function () {
if (this.x > 0) {
return descriptor.value.apply(this, arguments);
} else {
throw new Error(`can't invoke ${ propertyKey }`);
}
}
return newDescriptor;
}
class A {
constructor(private x: number) {}
@deco
methodA() {
console.log("A.methodA");
}
}
let a1 = new A(10);
a1.methodA(); // prints: "A.methodA"
let a2 = new A(-10);
a1.methodA(); // throws error