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

标签 javascript typescript ecmascript-6 babeljs typescript2.3

我已将记录器移植到 TypeScript,并且与 native 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)
    }
}, …

问题:

  1. 有没有办法告诉 TypeScript 接受方法的任何参数,但不会生成死代码?
  2. 如果不是,是否可以建议编译器忽略那些未使用的参数?

顺便说一句,为什么参数数组的转换效率如此低下?我会使用数组 slice 方法...

最佳答案

由于您没有使用 ...args: any[] 部分,生成的代码变得臃肿...

您可以使用它:

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

但是您仍然会获得比您想要的更多的代码,因此您可以向您的方法添加另一个签名,并获得不带参数的实际实现:

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

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

关于javascript - 避免在 TypeScript 中生成 `f(...args: any[])` 的死代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44247075/

相关文章:

javascript - 如何使用 Gulp 在 Node 中要求 jQuery?

javascript - 尝试使用 JavaScript 将用户名和密码存储在 cookie 中

javascript - 从声明它的函数外部访问变量

javascript - Okta 是否使用 Passport.js?

angular - Angular 11 中的 "No overload matches this call"

javascript - 如何使用 ES6 类实例属性和方法扩展对象

javascript - 日期未显示 eonasdan datetimepicker

javascript - Angular 4 Material 标题排序问题

javascript - 创建一个与另一个形状相同的树数据结构

javascript - 如何将 sass 文件导入 React 中的单个组件