I have a class written in Javascript ES6. When I try to execute nodemon
command I always see this error TypeError: Class constructor Client cannot be invoked without 'new'
The full error is mentioned below:
/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)
What I am trying to do is, I have created a class and then created an instance of that class. Then I am trying to export that variable.
The class structure is defined below:
class FBClient extends FabricClient{ constructor(props){ super(props); } <<< FUNCTIONS >>> }
How I am trying to export the variable ->
var client = new FBClient(); client.loadFromConfig(config); export default client = client;
You can find the full code here > https://hastebin.com/kecacenita.js Code generated by Babel > https://hastebin.com/fabewecumo.js
The problem is that the class extends native ES6 class and is transpiled to ES5 with Babel. Transpiled classes cannot extend native classes, at least without additional measures.
class TranspiledFoo extends NativeBar { constructor() { super(); } }
results in something like
function TranspiledFoo() { var _this = NativeBar.call(this) || this; return _this; } // prototypically inherit from NativeBar
Since ES6 classes should be only called with new
, NativeBar.call
results in error.
ES6 classes are supported in any recent Node version, they shouldn't be transpiled. es2015
should be excluded from Babel configuration, it's preferable to use env
preset set to node
target.
The same problem applies to TypeScript. The compiler should be properly configured to not transpile classes in order for them to inherit from native or Babel classes.
I was transpiling not Javascript but Typescript, and ran into the same problem.
I edited the Typescript compiler config file, tsconfig.json
, to generate ES2017 Javascript code:
{ "compilerOptions": { "target": "ES2017",
instead of whatever the default is, ES2015? — then all worked fine.
(Maybe this answer can be helpful for people who use Typescript and find this question when they search for the same error message, like I did.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With