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

为何TypeScript无法识别NPM包中bar与hello/world的导出类型?

问题原因

当TypeScript使用module: CommonJS + moduleResolution: Node(对应Node10及之前的旧版模块解析逻辑)时,它不会完全遵循package.json exports字段中的types映射,尤其是导出路径与类型文件路径不直接匹配的场景:

  • 对于./foo,类型文件是dist/types/foo.d.ts,和导出路径同名,TypeScript在Node解析模式下会自动查找同名.d.ts,刚好和exports里的types指向一致,所以能正常识别。
  • 对于./bar和./hello/world,类型文件是对应目录下的index.d.ts,但TypeScript的Node解析模式会优先查找与导出路径同名的.d.ts文件(比如bar.d.ts、hello/world.d.ts),找不到就直接报错,不会去读取exports里的types配置来匹配类型文件。

而纯Node.js环境能正常运行,是因为Node本身的模块解析完全遵循exports字段的映射,不管是文件还是目录下的index文件都能正确定位。

解决方案

方案1:升级TypeScript模块解析模式(推荐)

修改项目tsconfig.json中的moduleResolution为Node16或NodeNext:

{
  "compilerOptions": {
    "module": "CommonJS",
    "moduleResolution": "Node16"
  }
}

Node16+/NodeNext解析模式完全遵循Node.js的ESM/CJS模块解析规则,会正确读取exports字段里的types映射,不管类型文件是直接同名还是目录下的index文件都能识别。

方案2:兼容旧版解析模式

如果无法升级解析模式,可以在package.json中添加typesVersions字段,手动为导出路径映射类型文件:

{
  "exports": { /* 保留原有的exports配置 */ },
  "typesVersions": {
    "*": {
      "bar": ["./dist/types/bar/index.d.ts"],
      "hello/world": ["./dist/types/hello/world/index.d.ts"]
    }
  }
}

typesVersions是TypeScript专门用于处理不同版本编译器类型映射的字段,旧版Node解析模式会读取这个配置来找到对应的类型文件。

方案3:补充同名类型文件

在dist/types目录下创建与导出路径同名的.d.ts文件,内容直接导出对应index文件的类型:
比如创建dist/types/bar.d.ts:

export * from './bar/index';

创建dist/types/hello/world.d.ts:

export * from './hello/world/index';

这样TypeScript在Node解析模式下查找同名.d.ts时就能找到,间接获取到正确的类型定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:22:02