web-dev-qa-db-ja.com

Javascript ES6 TypeError: 'new'がないとクラスコンストラクタークライアントを呼び出せません

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;

完全なコードはここにあります> https://hastebin.com/kecacenita.js Babelによって生成されたコード> https://hastebin.com/fabewecumo.js

27
Akshay Sood

問題は、クラスがネイティブES6クラスを拡張し、BabelでES5にトランスパイルされることです。変換されたクラスは、少なくとも追加の対策なしでは、ネイティブクラスを拡張できません。

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

結果のようなもの

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

ES6クラスはnewでのみ呼び出す必要があるため、NativeBar.callはエラーになります。

ES6クラスは、最近のバージョンNode=でサポートされているため、トランスパイルしないでください。es2015はBabel設定から除外する必要があります。 envプリセットをnode targetに設定 を使用することをお勧めします。

7
estus

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"
    ]
  },
0
Chandan Aswal

私はJavascriptではなくTypeScriptを変換していて、同じ問題に遭遇しました。

TypeScriptコンパイラー構成ファイルtsconfig.jsonを編集して、ES2017 Javascriptコードを生成しました。

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

デフォルトではなく、ES2015? —その後はすべて正常に機能しました。

(たぶん、この回答は、TypeScriptを使用していて、私と同じように同じエラーメッセージを検索するときにこの質問を見つける人にとって役立つ場合があります。)

0
KajMagnus