避免在TypeScript中生成`f(... args:any [])`的死代码

时间:2017-05-29 16:38:02

标签: javascript typescript ecmascript-6 babeljs typescript2.3

我已将记录器移植到TypeScript,并且与原生JavaScript实现相比,对代码大小感到非常惊讶。

来源:

class Logger {
  // …    

  trace(...args: any[]) {
    this.invoke(TRACE, arguments);
  }

  debug(...args: any[]) {
    this.invoke(DEBUG, arguments);
  }
}

注意:...args: any[]仅用于满足编译器。 <{1}}未在实施中使用且不需要。

TypeScript生成:

args

Babel(或Webpack / Uglify的一些内部人员,完全不知道)生成:

Logger.prototype.trace = function () {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i - 0] = arguments[_i];
    }
    this.invoke(TRACE, arguments);
};

问题:

  1. 有没有办法告诉TypeScript接受方法的任何参数,但是在某种程度上不会生成死代码?
  2. 如果没有,建议编译器忽略那些未使用的参数吗?
  3. BTW为什么参数数组转换得如此低效?我使用了数组… }, { key: "trace", value: function () { for (var e = arguments.length, n = Array(e), t = 0; t < e; t++)n[t] = arguments[t]; this.invoke(s, arguments) } }, { key: "debug", value: function () { for (var e = arguments.length, n = Array(e), t = 0; t < e; t++)n[t] = arguments[t]; this.invoke(l, arguments) } }, … 方法...

1 个答案:

答案 0 :(得分:2)

由于您未使用的...args: any[]部分,生成的代码会膨胀......

你可以使用它:

trace(...args: any[]) {
    this.invoke(TRACE, ...args);
}

但是你仍然可以得到比你想要的更多的代码,所以你可以为你的方法添加另一个签名,并且实际的实现没有args:

trace(...args: any[]);
trace() {
    this.invoke(TRACE, arguments);
}

这将确保编译器理解方法需要参数但实现没有它们,因此它不会为它们生成代码。