将以下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()
返回一个常量或者是否会在每次调用时计算函数?
答案 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