将仅使用常量的静态javascript函数编译为常量

时间:2016-04-29 20:11:16

标签: javascript performance compilation typescript

将以下javascript

var StaticTest_A = (function () {
  function StaticTest_A() {
  }
  StaticTest_A.GetConstant = function () {
    return StaticTest_B.MyNumber + StaticTest_B.MyNumber;
  };
  return StaticTest_A;
})();
var StaticTest_B = (function () {
  function StaticTest_B() {
}
StaticTest_B.MyNumber = 5;
  return StaticTest_B;
})();

从此TypeScript生成

class StaticTest_A
{
   static GetConstant():number
   {
       return StaticTest_B.MyNumber + StaticTest_B.MyNumber;
   }
}

class StaticTest_B
{
   static MyNumber = 5;
}

编译所以StaticTest_A.GetConstant()返回一个常量或者是否会在每次调用时计算函数?

1 个答案:

答案 0 :(得分:3)

不,这个表达式每次都会运行,因为StaticTests_B.MyNumber可能会在此期间发生变化,正如Pointy指出的那样。此外,TypeScript不会更改您编写的代码以提高性能 - 实际上是non-goal of the compiler

如果出于性能原因只想进行一次计算,那么您必须提出自己的解决方案。例如,您可以创建一个可重用的decorator,它在第一次运行时缓存该值,然后返回缓存的值。然后,您可以随意使用该装饰器:

function methodMemoize(target: Function | Object, key: string, descriptor: TypedPropertyDescriptor<() => any>) {
    const originalValue = descriptor.value;
    let hasRun = false;
    let returnedValue: any;

    descriptor.value = function(...args: any[]) {
        if (!hasRun) {
            returnedValue = originalValue.apply(this, args);
            hasRun = true;
        }

        return returnedValue;
    };
}

class StaticTest_A
{
    @methodMemoize
    static GetConstant()
    {
        console.log("run only once");
        return StaticTest_B.MyNumber + StaticTest_B.MyNumber;
    }
}

class StaticTest_B
{
   static MyNumber = 5;
}

StaticTest_A.GetConstant(); // "run only once", returns 10
StaticTest_A.GetConstant(); // returns cached 10