You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让TypeScript类支持CommonJS require直接导入

问题:TypeScript转译后保持CommonJS风格直接导入

背景

原有JavaScript类定义:

// MyClass.js
module.exports = class MyClass {
  //...
}

其他JavaScript模块中导入方式:

// otherModule.js
const MyClass = require('./MyClass');

将类转换为TypeScript后,当前定义如下:

// MyClass.ts
class MyClass {
  // ...
}
export default MyClass;

此时在JavaScript文件中必须通过以下两种方式导入:

// otherModule.js
const MyClass = require('./MyClass').default;
// 或
const { default: MyClass } = require('./MyClass');

需求

希望避免显式指定default,继续使用const MyClass = require('./MyClass');的方式导入,允许修改TypeScript类的定义或导出方式。

解决方案

方案1:沿用CommonJS导出语法

直接在TypeScript中使用module.exports导出类,和原JavaScript写法保持一致:

// MyClass.ts
class MyClass {
  // ...
}
module.exports = MyClass;

转译后的JavaScript文件会直接将MyClass赋值给module.exports,原有JS模块无需修改导入代码即可正常使用。

方案2:配置TypeScript编译选项

如果希望保留ES模块的export default语法,可修改tsconfig.json开启兼容选项:

{
  "compilerOptions": {
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "module": "CommonJS" // 针对Node.js环境,该选项为默认值
  }
}

开启esModuleInterop后,TypeScript会自动生成兼容CommonJS的转译代码,此时JS模块依然可以用const MyClass = require('./MyClass');直接导入。

方案3:命名导出+CommonJS导出别名

若需同时支持ES模块和CommonJS导入,可采用命名导出结合module.exports的方式:

// MyClass.ts
export class MyClass {
  // ...
}
module.exports = MyClass;

这样既保留了ES模块的命名导出能力,又让CommonJS的require可以直接获取到类。

内容的提问来源于stack exchange,提问作者devklick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:45:15