一旦addOne函数执行后如何让乘法和减法执行并影响其结果 (((2 + 1)* 2)-1 = 5
class MathClass{
@subtract(1)
@multiply(2)
addOne(number:number) {
return number+1;
}
}
console.log(new MathClass().addOne(2)) //should print 5
答案 0 :(得分:1)
根据需要为2个运算符创建2个修饰符。对于这种情况,您可以创建一个装饰器工厂以重用代码:
function operatorFactory(operator: (result: number) => number) {
return (
target: Object,
propertyName: string,
propertyDescriptor: PropertyDescriptor,
) => {
const method = propertyDescriptor.value;
propertyDescriptor.value = function (...args: any[]) {
const result = method.apply(this, args); // Call original function
return operator(result); // Call operator
}
return propertyDescriptor;
}
}
function subtract(subtrahend: number = 1) {
return operatorFactory((num: number) => {
return num - subtrahend;
});
};
function multiply(factors: number = 1) {
return operatorFactory((num: number) => {
return num * factors;
});
};
您看到operatorFactory
的参数是一个函数,该函数定义您使用result
的方式-前置运算符的结果。
subtract
装饰器获取的参数是一个数字-被减数运算,并使用“减法”运算符调用operatorFactory
。
与multiply
相同。
请注意,方法装饰器的顺序非常重要。对于您的案件((number+1)*2)-1
,顺序将如您所想:
class MathClass {
@subtract(1)
@multiply(2)
addOne(number: number) {
return number + 1;
}
}
console.log(new MathClass().addOne(2)) // Print 5
如果您撤销订单,您将有一个像((number+1)-1)*2
这样的运算符,其代码为:
class MathClass {
@multiply(2)
@subtract(1)
addOne(number: number) {
return number + 1;
}
}
console.log(new MathClass().addOne(2)) // Print 4