【问题标题】:Is there a way to prevent transpile Class to constructor?有没有办法防止将类转换为构造函数?
【发布时间】:2018-09-11 19:12:51
【问题描述】:

我有一个使用 Flow 的 node.js 应用程序。为了摆脱 Flow 语法,我使用了 babel:

{
    "presets": ["env", "flow"],
    "plugins":  [
        "transform-flow-strip-types"
    ]
}

它可以工作,但问题是使用“instanceof”运算符。我像这样扩展了标准错误构造函数:

/* @flow */
class BadRequestError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class InvalidRequestBodyError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class UnauthorizedError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class ExpiredResourceError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class InternalServerError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class ResourceNotFoundError extends Error {
    constructor(message:string) {
        super(message);
    }
}

module.exports = {
    BadRequestError,
    InvalidRequestBodyError,
    UnauthorizedError,
    ExpiredResourceError,
    InternalServerError,
    ResourceNotFoundError
};

在 Node.js 中,它可以工作。但是在转译之后,instanceof 不再起作用,因为 Classes 转换为 Constructors。

有没有办法预防?

使用 babel-cli@6.26.0 和 node@8.9.0,这是我使用的命令行:

$ node_modules/.bin/babel ./src -d ./dist

【问题讨论】:

    标签: node.js ecmascript-6 babeljs transpiler


    【解决方案1】:

    正如Babel preset-env documentation 所说,

    没有任何配置选项,babel-preset-env 的行为与 babel-preset-latest(或 babel-preset-es2015、babel-preset-es2016 和 babel-preset-es2017 一起)完全相同。

    这就是 ES6 类被转译为常规函数的原因。

    此页面包含有关在 Node 中使用此预设的所有信息:

    为方便起见,您可以使用 "node": "current" 仅包含用于运行 Babel 的 Node.js 版本的必要 polyfill 和转换

    应该是:

    {
        "presets": ["env", {
          "targets": {
            "node": "current"
          }
        }, "flow"],
        "plugins":  [
            "transform-flow-strip-types"
        ]
    }
    

    【讨论】:

    • 感谢您的回复,不过没问题。我通过添加另一个插件和有人告诉我的技术来修复。
    • 很高兴你解决了它,但这是真正的问题。由于您已经在使用env,因此应该使用这种方式。它仅用于应用指定环境中所需的转换。
    • 好的,谢谢。所以我只是将目标环境更改为节点:6.9.5,这是我真正使用的目标平台,但 Babel 仍然将类转换为构造函数。紧随其后的是这个站点:node.green,Node 支持 v4.9.1 的类。为什么会这样?
    • @modernator 是的,从 4.0 开始支持类。我无法复制这个。我指定"node": "6.9.5",它的行为方式与"node": "current" 相同,不转译类。它是 Babel CLI 6.18.0 和 babel-preset-env 1.6.1。最新的 Babel 6 也一样,babeljs.io/repl/…
    【解决方案2】:

    我解决了这个问题

    1. 添加 babel-plugin-transform-b​​uiltin-extend
    2. 像这样改变类:

      class BadRequestError extends Error {
          constructor(message:string) {
          super(message);
      
              /* $FlowFixMe */
              this.constructor = BadRequestError;
              /* $FlowFixMe */
              this.__proto__ = BadRequestError.prototype;
          }
      }
      

    注意后面是this,它将在Ba​​bel 7中修复!

    【讨论】:

      猜你喜欢
      • 2015-10-11
      • 2021-12-03
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      相关资源
      最近更新 更多