【问题标题】:Call `super` on JavaScript instance method在 JavaScript 实例方法上调用 `super`
【发布时间】:2021-12-02 15:07:54
【问题描述】:

我正在尝试在 ES6 样式类的实例方法上调用 super,但遇到了 parcel/babel 构建错误。

@parcel/transformer-babel: 'super' is only allowed in object methods and classes. (1291:21)

我的代码实际上看起来像这样

class BaseClass {
    constructor(params) {
        this.params = params;
    }

    matches(other) {
        // do some matching logic
        return true; // or false
    }
}

class MyClass extends BaseClass {
    matches(other) {
        let match = super.matches(other);
        // do some additional matching logic
        return true; // or false
    }

}

错误是当我在MyClass 中调用super.matches(other) 时。

我在super 上找到的所有文档都谈到了它在constructor 中的使用,这很好,以及它在static 方法中的使用,但我没有发现实例方法。

这只是在 JS 中不起作用,是我做错了吗,还是与 babel 转换器或包裹有关?

【问题讨论】:

  • 由于代码在现代浏览器中运行良好,因此您的构建过程似乎存在问题。
  • 这在 JS 中有效,因此它与 babel 转换器/包裹有关
  • 谢谢,我认为你是对的。奇怪的是,我发现相同语法不会导致构建错误的情况,因此需要进一步挖掘。

标签: javascript oop babeljs parceljs


【解决方案1】:

Parcel v2 默认支持使用 swc 转译 es6 类语法。一个“陷阱”是,如果它在您的项目中检测到 .babelrc/babel.config.json 文件,它将切换到使用 babel 进行转译,然后由您来确保您提供的配置将转译类。

根据the docs

如果您只使用 @babel/preset-env@babel/preset-typescript@babel/preset-react,则可能不再需要 Babel。 Parcel 无需 Babel 配置即可自动支持所有这些功能,并且 Parcel 的默认转译器比 Babel 快得多。

所以我要尝试的第一件事就是删除项目中的所有.babelrc/babel.config.json 文件,以便您可以使用swc 进行尝试。如果这不起作用(可能是因为您正在执行 swc 不支持的其他操作),请确保 @babel/preset-env 包含在您的 babel 配置中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2018-05-27
    • 2016-08-30
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多