避免在 TypeScript 中为 `f(...args: any[])` 生成无效代码
Avoid dead code generation for `f(...args: any[])` in TypeScript
我已将一个记录器移植到 TypeScript,与本机 JavaScript 实现相比,我对代码大小感到非常惊讶。
来源:
class Logger {
// …
trace(...args: any[]) {
this.invoke(TRACE, arguments);
}
debug(...args: any[]) {
this.invoke(DEBUG, arguments);
}
}
注意:...args: any[]
只是为了满足编译器的需要。 args
未使用,在实现中不需要。
TypeScript 生成:
Logger.prototype.trace = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
this.invoke(TRACE, arguments);
};
Babel(或 Webpack/Uglify 的一些内部结构,不确切知道)生成:
… }, {
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)
}
}, …
问题:
- 有没有办法告诉 TypeScript 接受方法的任何参数,但不会生成死代码?
- 如果不是,是否可以建议编译器忽略那些未使用的参数?
顺便说一句,为什么参数数组转换得如此低效?我会使用数组 slice
方法...
由于您未使用的 ...args: any[]
部分,生成的代码臃肿...
你可以使用它:
trace(...args: any[]) {
this.invoke(TRACE, ...args);
}
但是您仍然会得到比您想要的更多的代码,因此您可以向您的方法添加另一个签名并获得没有参数的实际实现:
trace(...args: any[]);
trace() {
this.invoke(TRACE, arguments);
}
这将确保编译器理解方法需要参数但实现没有参数,因此它不会为它们生成代码。
我已将一个记录器移植到 TypeScript,与本机 JavaScript 实现相比,我对代码大小感到非常惊讶。
来源:
class Logger {
// …
trace(...args: any[]) {
this.invoke(TRACE, arguments);
}
debug(...args: any[]) {
this.invoke(DEBUG, arguments);
}
}
注意:...args: any[]
只是为了满足编译器的需要。 args
未使用,在实现中不需要。
TypeScript 生成:
Logger.prototype.trace = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
this.invoke(TRACE, arguments);
};
Babel(或 Webpack/Uglify 的一些内部结构,不确切知道)生成:
… }, {
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)
}
}, …
问题:
- 有没有办法告诉 TypeScript 接受方法的任何参数,但不会生成死代码?
- 如果不是,是否可以建议编译器忽略那些未使用的参数?
顺便说一句,为什么参数数组转换得如此低效?我会使用数组 slice
方法...
由于您未使用的 ...args: any[]
部分,生成的代码臃肿...
你可以使用它:
trace(...args: any[]) {
this.invoke(TRACE, ...args);
}
但是您仍然会得到比您想要的更多的代码,因此您可以向您的方法添加另一个签名并获得没有参数的实际实现:
trace(...args: any[]);
trace() {
this.invoke(TRACE, arguments);
}
这将确保编译器理解方法需要参数但实现没有参数,因此它不会为它们生成代码。