我已将记录器移植到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);
};
问题:
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)
}
}, …
方法...
答案 0 :(得分:2)
由于您未使用的...args: any[]
部分,生成的代码会膨胀......
你可以使用它:
trace(...args: any[]) {
this.invoke(TRACE, ...args);
}
但是你仍然可以得到比你想要的更多的代码,所以你可以为你的方法添加另一个签名,并且实际的实现没有args:
trace(...args: any[]);
trace() {
this.invoke(TRACE, arguments);
}
这将确保编译器理解方法需要参数但实现没有它们,因此它不会为它们生成代码。