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

使用tsc为npm包打包单份d.ts声明文件时出现模块识别错误如何解决?

问题根因
  1. tsconfig配置错误:你配置了"module": "system" + "outFile",该模式下TypeScript生成的.d.ts是基于原文件名的全局命名模块声明(即你看到的declare module "foo"结构),不会生成适配npm包入口的根模块声明,因此外部项目引入时无法识别该声明文件为包的导出模块,触发「不是一个模块」的报错。
  2. 导入导出不匹配:src/foo.ts中仅导出了具名函数testFn,无默认导出,使用import foo from "@repo/proj"的默认导入语法本身也无法匹配到对应导出内容。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:09:02