打字稿如何在不修改功能的情况下更改功能结果

时间:2020-02-26 00:22:43

标签: typescript

一旦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

1 个答案:

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