【问题标题】:class constructor cannot be invoked without 'new没有'new 就不能调用类构造函数
【发布时间】:2017-09-29 06:15:48
【问题描述】:

我正在尝试在使用 angular-cli 创建的 angular 2 项目中使用第 3 方打字稿库(antlr - https://github.com/tunnelvisionlabs/antlr4ts)。它因此错误而失败 类构造函数 MyLexer 不能在没有 'new 的情况下被调用。如果你看下面的代码 sn-p ,它在调用 super(); 时失败了。而且 Lexer.js 位于 antlr 库的 node_modules 中。

我没有在我的项目中使用 babel,但我发现另一个 stackoverflow 帖子与我的 Babel error: Class constructor Foo cannot be invoked without 'new' 有类似的错误。它说由于 ES6 类的工作方式,您不能使用转译类扩展本机类。它是否也与我的问题有关?请指导。

代码 sn-p

let inputStream = new ANTLRInputStream("sometext");
      let lexer = new MyLexer(inputStream); // it fails here
      let tokenStream = new CommonTokenStream(lexer);
      let parser = new MyParser(tokenStream);

MyLexer.ts(生成的代码)

    export class MyLexer extends Lexer {
        constructor(input: CharStream) {
                super(input); // it fails here. 
                this._interp = new LexerATNSimulator(MyLexer._ATN, this);
            }    
        // more code
     }

Lexer.js(位于 node_modules 中)

class Lexer extends Recognizer_1.Recognizer {
    constructor(input) {
        super();
//more code

【问题讨论】:

    标签: angular typescript antlr antlr4


    【解决方案1】:

    这很令人惊讶。我在我的节点模块antlr4-graps 中使用与您相同的方法,它的ES6 设置为transpilation target,并且一切运行良好。仔细看看那里。也许您可以发现您的代码和我的代码之间的其他显着差异。我假设你已经安装了 antlr4ts 的最新 alpha。

    【讨论】:

    • 谢谢@Mike Lischke。我认为问题在于我的项目中的某个地方仍然引用了 ES5。我把所有东西都改成了 ES6,那个错误就消失了。我猜是因为 antlr4ts 是使用 ES6 转译的,所以我也只需要在我的项目中使用 ES6。真的吗?现在我得到了一个不同的错误。未捕获的 ReferenceError:ExpressionContext 未在 Object.759 (BQLParser.ts:136) 中定义。任何想法?此错误来自生成的解析器代码。
    • 嗯,antlr4ts 尝试使用最新的 ES 功能,包括注释,所以是的,您也必须使用自己的代码保持最新:-) 对于您的其他错误,请打开一个单独的问题。我们需要看看语法代码。
    • 谢谢!我打开了一个单独的问题。
    • @user911 你能解释一下你的意思,“仍然有 ES5 的引用”吗?我也遇到了这个错误,但我无法修复它。
    • @user911 我遇到了同样的错误,但是通过将我的 *GrammarParser 移动到生成的 *GrammarParser.ts 文件的底部,它正在工作。问题是解析器的生成实现在定义类之前引用它们。通过将其移动到文件的底部,它可以读取定义。破解但它有效。
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2019-04-21
    • 2021-05-17
    • 2021-12-27
    相关资源
    最近更新 更多