使用tsc为npm包打包单份d.ts声明文件时出现模块识别错误如何解决?
问题根因
- tsconfig配置错误:你配置了
"module": "system"+"outFile",该模式下TypeScript生成的.d.ts是基于原文件名的全局命名模块声明(即你看到的declare module "foo"结构),不会生成适配npm包入口的根模块声明,因此外部项目引入时无法识别该声明文件为包的导出模块,触发「不是一个模块」的报错。 - 导入导出不匹配:
src/foo.ts中仅导出了具名函数testFn,无默认导出,使用import foo from "@repo/proj"的默认导入语法本身也无法匹配到对应导出内容。 - package.json配置错误:
files字段配置的/dist为绝对路径,npm无法正确识别需要发布的目录,需改为相对路径dist。
修复方案
推荐使用零配置TS打包工具tsup实现单JS+单d.ts的打包需求,无需手动调整复杂的tsconfig规则,操作步骤如下:
- 安装开发依赖:
npm i tsup -D
- 在
package.json中新增打包脚本:
{ "scripts": { "build": "tsup src/foo.ts --format esm,cjs --dts --out-dir dist" } }
- 修改
package.json的包发布配置:
{ "main": "dist/index.cjs", "module": "dist/index.js", "types": "dist/index.d.ts", "files": ["dist"] }
- 执行打包命令:
npm run build
打包完成后会自动生成ESM、CommonJS两种格式的单JS产物,以及对应根模块导出的单份index.d.ts声明文件,完全符合npm包发布规范。
如果需要支持默认导入,可新增入口文件src/index.ts,聚合所有对外导出内容:
export * from './foo' // 新增默认导出 export default { testFn }
修改打包命令入口为tsup src/index.ts --format esm,cjs --dts --out-dir dist即可。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

