无需esModuleInterop,解决CJS第三方库.d.ts的ts(2497)错误
解决纯CJS TypeScript项目中第三方库类型声明的TS2497错误
在不启用esModuleInterop的前提下,有两种可靠的解决方式:
方式一:使用TypeScript的CJS专用导入语法
直接替换原有的import * as语法为TS针对CommonJS模块设计的import = require()写法,这是最贴合纯CJS环境的方案:
/* c8 ignore start */ import func = require("third-party-library"); const example = func();
你的third-party-library.d.ts声明文件不需要修改,这种导入方式会直接对应到CJS的require调用,转译后的代码和之前// @ts-ignore时的输出一致,同时能正确匹配export = func的类型声明。
方式二:调整类型声明文件的写法(适配原有导入语法)
如果你想保留import * as func的导入方式,可以修改声明文件,将导出改为命名空间包裹的函数,模拟TS默认期望的ES模块命名导出结构:
// third-party-library.d.ts declare module "third-party-library" { function func(): string; export { func }; }
注意:这种写法仅在第三方库实际导出的是{ func: func }对象时完全准确,如果库是直接module.exports = func(即导出单个函数),这种声明属于适配TS导入语法的妥协写法,精准度不如方式一。
错误原因说明
你遇到的TS2497错误,本质是TS默认配置下,import * as语法期望模块是ES模块的命名导出结构,但第三方库是CJS的module.exports = func(单个值导出),TS认为这种导入不符合ES模块规范。而import = require()是TS原生支持CJS模块导入的语法,完全匹配export =的声明方式,无需额外配置。
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

