如何在NPM创建仅导出类型的包?解决ts(2306)模块错误
解决纯类型NPM/Monorepo包的TS2306模块错误
一、修正package.json配置
纯类型包无需JS运行时入口,需移除冗余字段,保留类型专属配置:
{ "name": "@acme/types", "type": "module", "types": "./index.d.ts", "exports": { ".": { "types": "./index.d.ts" }, "./package.json": "./package.json" }, "sideEffects": false }
type: "module":明确包为ES模块,适配现代TypeScript模块解析逻辑types:指定TypeScript类型入口文件exports:仅暴露类型入口,避免JS模块解析混淆sideEffects: false:告知打包工具该包无运行时副作用,优化构建流程
二、调整TypeScript配置
1. 根目录tsconfig.json配置
{ "compilerOptions": { "moduleResolution": "NodeNext", // 或"bundler",根据项目构建工具选择 "allowSyntheticDefaultImports": true, "esModuleInterop": true }, // Monorepo场景需添加include,确保类型文件被识别 "include": ["packages/types/**/*.d.ts"] }
2. Monorepo路径映射(可选)
如果使用pnpm/yarn/npm workspace,可在根tsconfig中添加路径映射,让TypeScript快速定位包:
{ "compilerOptions": { "paths": { "@acme/types": ["./packages/types/index.d.ts"] } } }
三、验证文件内容与结构
确保index.d.ts的模块导出语法正确(你的原内容符合要求,再次确认):
export type MyType = { name: string; };
若改用index.ts作为源文件,需在包的tsconfig中开启declaration: true,并将package.json的types指向编译生成的index.d.ts,但纯类型场景更推荐直接使用index.d.ts。
四、重新链接/安装包
- Monorepo场景:执行包管理工具安装命令(如
pnpm install/yarn install),确保包被正确链接到工作区 - 独立包场景:重新将包安装到目标项目中
错误原因分析
- 原配置中
main字段指向.d.ts文件,导致Node.js尝试将其作为JS模块加载,引发解析混乱 exports中多余的default/import入口,混淆了JS模块与类型模块的解析逻辑- TypeScript模块解析策略未适配ES模块,无法识别类型文件的模块身份
内容的提问来源于stack exchange,提问作者eakl
相关产品推荐
相关产品推荐

