【问题标题】:Babel error: Class constructor Foo cannot be invoked without 'new'Babel 错误:没有'new' 就不能调用类构造函数 Foo
【发布时间】:2016-04-12 15:26:39
【问题描述】:

我正在使用 babel 进行转译。

我有class BaseComponent,它由class Logger 扩展。

当我在浏览器中运行new Logger() 时,出现此错误

没有'new'就不能调用类构造函数BaseComponent

抛出这个的代码是:

var Logger = function (_BaseComponent) {
  _inherits(Logger, _BaseComponent);

  function Logger() {
    _classCallCheck(this, Logger);

    return _possibleConstructorReturn(this, Object.getPrototypeOf(Logger).call(this, "n")); //throws here
  }

【问题讨论】:

  • 这是babel的输出,还是你写的代码? (如果这是输出,请显示您编写的代码。)
  • 什么是BaseComponent
  • @loganfsmyth 只是一个 ES6 类

标签: ecmascript-6 babeljs


【解决方案1】:

由于 ES6 类的工作方式,您不能使用转译类扩展原生类。如果你的平台支持原生类,我的建议是,假设你在 Node 5 上,而不是使用预设的 es2015,使用 es2015-node5。这将导致 Babel 跳过类的编译,以便你的代码使用原生类,并且原生类可以扩展其他原生类。

【讨论】:

  • 哦,这真的很局限,反正我要开始作曲了!
  • @loganfsmyth - 我遇到了类似的错误。我有一个打字稿文件,它正在扩展一个 javascript 文件(带有关联的打字文件)。这是一个问题,因为 typescript 不能扩展转译的 javascript 文件,它只能扩展另一个 typescript 文件吗?
  • 我也遇到了同样的问题,试图在 CoffeeScript 中扩展一个 TypeScript 类(我已经被 Babel 转译了,因为由于某种原因 Node still 没有支持 ES6 导入)。我的解决方案是将babel-preset-env 配置为针对最新的Node 版本(请参阅babeljs.io/docs/plugins/preset-env),这只会转译import 语句并单独保留类。
  • 使用 Node 12 的修复方法是什么?
【解决方案2】:

另一种解决方案是在.babelrc 中包含{ exclude: ["transform-es2015-classes"] }

presets: [
   ["env", { exclude: ["transform-es2015-classes"] }]
]

更新:在“env”的最新版本中,预设插件名称已更改(例如,现在是“transform-classes”)。使用“调试”选项检查包含哪些插件。

【讨论】:

  • 您的意思是将include 类转换为函数?
  • 完美解决方案。
  • 这是解决方案,但应该是 include 而不是 exclude
  • 感谢它的工作! include: ['transform-classes'],
猜你喜欢
  • 1970-01-01
  • 2017-09-29
  • 2018-09-19
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多