Javascript ES6 TypeError:类构造函数 Client 无法在没有“new”的情况下调用

问题描述 投票:0回答:10

我有一个用 Javascript ES6 编写的类。当我尝试执行

nodemon
命令时,我总是看到此错误
TypeError: Class constructor Client cannot be invoked without 'new'

完整错误如下:

/Users/akshaysood/Blockchain/fabricSDK/dist/application/Transaction.js:45
        return (0, _possibleConstructorReturn3.default)(this, (FBClient.__proto__ || (0, _getPrototypeOf2.default)(FBClient)).call(this, props));
                                                                                                                              ^

TypeError: Class constructor Client cannot be invoked without 'new'
    at new FBClient (/Users/akshaysood/Blockchain/fabricSDK/dist/application/Transaction.js:45:127)
    at Object.<anonymous> (/Users/akshaysood/Blockchain/fabricSDK/dist/application/Transaction.js:195:14)
    at Module._compile (module.js:641:30)
    at Object.Module._extensions..js (module.js:652:10)
    at Module.load (module.js:560:32)
    at tryModuleLoad (module.js:503:12)
    at Function.Module._load (module.js:495:3)
    at Module.require (module.js:585:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/akshaysood/Blockchain/fabricSDK/dist/routes/users.js:11:20)

我想做的是,我创建了一个类,然后创建了该类的实例。然后我尝试导出该变量。

类结构定义如下:

class FBClient extends FabricClient{

    constructor(props){
        super(props);
    }

<<< FUNCTIONS >>>

}

我如何尝试导出变量 ->

var client = new FBClient();
client.loadFromConfig(config);

export default client = client;

您可以在这里找到完整的代码 --> 链接。 Babel 生成的代码 --> Link.

javascript node.js ecmascript-6 syntax-error
10个回答
117
投票

问题是该类扩展了原生 ES6 类,并使用 Babel 转译为 ES5。转译类无法扩展本机类,至少在没有额外措施的情况下是这样。

class TranspiledFoo extends NativeBar {
  constructor() {
    super();
  }
}

结果类似于

function TranspiledFoo() {
  var _this = NativeBar.call(this) || this;
  return _this;
}
// prototypically inherit from NativeBar 

由于 ES6 类只能用

new
调用,因此
NativeBar.call
会导致错误。

任何最新的 Node 版本都支持 ES6 类,它们不应该被转译。

es2015
应从 Babel 配置中排除,最好使用
env
预设设置为
node
target

同样的问题适用于 TypeScript。编译器应该正确配置为不转译类,以便它们继承自本机或 Babel 类。


37
投票

我不是在编译 Javascript,而是在编译 Typescript,并且遇到了同样的问题。

我编辑了 Typescript 编译器配置文件

tsconfig.json
,以生成 ES2017 Javascript 代码:

{
    "compilerOptions": {
        "target": "ES2017",

而不是默认值,ES2015? - 然后一切正常。

(也许这个答案对于使用 Typescript 并在搜索相同错误消息时找到这个问题的人(就像我一样)有帮助。)


17
投票

对于那些使用 ts-node 的人来说,您的

tsconfig.json
可能无法被 ts-node 加载。

  1. 确保您已为
    tsconfig.json
    设置以下选项:
    {
        "compilerOptions": {
            "target": "ES6",
            ...
        }
    }
  1. 尝试
    ts-node --script-mode
    或使用
    --project
    指定
    tsconfig.json
    的路径。

8
投票

package.json
中,您可以通过
@babel/preset-env
使用目标配置。 将
esmodules
设置为“true”。

下面是我在文件中使用的示例:

  "babel": {
    "presets": [
      [
        "@babel/preset-env",
        {
          "targets": {
            "esmodules": true
          }
        }
      ],
      "@babel/preset-react",
      "@babel/preset-flow"
    ],
    "plugins": [
      "@babel/plugin-proposal-class-properties"
    ]
  },

3
投票

对于 Angular 9+,这也可能是使用打字稿编译标志的问题:

  • downlevelIteration
  • importHelpers

更多信息请参见L https://www.typescriptlang.org/tsconfig#downlevelIteration.

尝试在您的

tsconfig.josn
中使用此标志:

{
    "compilerOptions": {
        ...
        "downlevelIteration": true,
        "importHelpers": true,
        ...
    }
}

没有

"importHelpers": true
它也应该有效。


此解决方案主要适用于 Angular 9+ 和 ngcc 编译器 - 这是 Angular 11 中出现的问题。 维护了包的自定义配置(自定义 ng-packgr 配置 - Angular CLI 库生成是在 Angular 6 中引入的),因为有项目中的 Angular 4+。将这些包迁移到 Angular 9+ 库(项目文件夹)后,错误开始发生。我发现这些标志(严格来说是 downlevelIteration)完全解决了问题。


1
投票

如果你不使用 babel 和简单的 typescript。我在材料上遇到了错误。尝试减少版本并将它们降低到相似的版本。我的软件包有多种版本。我通过降低 cdk、material 等软件包的软件包版本解决了这个问题。

Check the image of my final package.json


1
投票

检查 appmodule.ts 中的“entities”数组 我也错过了。当我保留查询中使用的实体名称时,问题得到解决。 希望这个答案有帮助。


0
投票

我在 nextjs 中使用了在我的 ObjectId 之前编写的内容,并且它有效。


0
投票

如果您已经在 tsconfig 上完成了所有这些配置,但它仍然不起作用,也许您有 tsconfig.base 文件。 也尝试改变它。


-10
投票

我希望您已经能够解决您的问题,这是我针对此错误的解决方案:

class indexRoutes
{
    
    public  router: Router= Router();
}
const INDEX_ROUTES = new indexRoutes();
export default INDEX_ROUTES.router;
© www.soinside.com 2019 - 2024. All rights reserved.