使用ts-node运行TS代码时super调用报错:类构造函数需用new调用
问题排查与解决方案
核心原因
你的错误本质是父类B(或它继承的Connection类)并非标准ES6 Class语法实现,而是基于传统构造函数+原型链的方式定义的,或是被编译工具转译成了非ES6兼容的代码。当ES6子类用super()调用这类父类时,就会触发cannot be invoked without 'new'错误——因为ES6 Class的super()调用规则和传统构造函数的调用方式不匹配。
具体排查与修复步骤
检查父类
B的定义- 确认
B是否直接继承了Connection,且Connection的实现是否为ES6 Class:- 若
Connection是传统构造函数(比如function Connection() {}这种形式),ES6 Class无法直接继承它,需改用传统构造函数的继承方式:function A(endpoint: string) { Connection.call(this, endpoint); } A.prototype = Object.create(Connection.prototype); A.prototype.constructor = A; - 若
B是你自己的代码,检查是否被TypeScript编译成了非ES6的构造函数(比如开启了downlevelIteration或其他降级编译选项),确保父类的编译输出也是ES6 Class。
- 若
- 确认
检查TypeScript编译配置的其他关键选项
除了target: ES6,还要确认以下配置:module:设为CommonJS(Node.js环境默认)或ES6,避免模块系统不兼容导致的类加载问题;esModuleInterop:设为true,处理第三方库的模块导出格式问题;skipLibCheck:如果报错来自第三方库,设为true跳过库的类型检查,避免类型定义干扰编译结果。
示例tsconfig.json片段:
{ "compilerOptions": { "target": "ES6", "module": "CommonJS", "esModuleInterop": true, "skipLibCheck": true } }清理编译缓存
ts-node可能缓存了旧的编译结果,执行以下命令清理缓存后再运行:npx ts-node --clear-cache直接编译成JS再运行
跳过ts-node,先编译TypeScript为JS再执行,排查是否是ts-node的编译问题:tsc --project tsconfig.json main.ts node main.js
额外提示
如果是使用第三方库的Connection类,确认库的版本是否和其他正常运行的环境一致——不同版本的库可能对Class的实现有差异,比如旧版本用传统构造函数,新版本改用ES6 Class。
内容的提问来源于stack exchange,提问作者Alaska
相关产品推荐
相关产品推荐

