用于验证方法

时间:2017-01-08 16:59:19

标签: javascript angular typescript

我想创建一个可以应用于方法的装饰器, 它的目标是控制是否允许您运行某种方法。 这意味着它应该具有某种条件,如果它通过它将像往常一样运行(在相同的上下文中)

以下是我拍摄的照片,但由于私人会员 失败,现在我无法访问该功能:

return function(target:any, propertyKey: string, descriptor: PropertyDescriptor){
    var funcToRun = descriptor.value;
    descriptor.value = () => {
        if(true) { //if has permissions
            return p.call(target);
        }
    }
}

提前致谢。

1 个答案:

答案 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

code in playground