如何从私有TypeScript npm包中直接导入子模块?
私有TypeScript npm包子路径导入及类型支持问题解决
问题背景
我正在开发供其他TS项目复用的私有TypeScript npm包@myorg/core,用于共享多仓库通用的枚举和类型。已开启tsconfig.json的"declaration": true,构建后生成了.d.ts文件。
项目结构:
src/ ├── enumerators/ │ └── index.ts ├── database-models/ │ └── index.ts ├── external-apis/ │ └── index.ts └── index.ts
src/index.ts统一导出所有资源:
export * as ExternalAPIs from './external-apis'; export * as Enumerators from './enumerators'; export * as DatabaseModel from './database-models'; // 注:原代码路径存在拼写错误,应为database-models
希望实现按需子路径导入,例如:
import * as Enumerators from '@myorg/core/Enumerators';
而非导入整个包:
import * as MyOrgCore from '@myorg/core';
已尝试配置package.json的exports字段,但出现报错:
Cannot find module '@myorg/core/Enumerators' or its corresponding type declarations.ts(2307)
解决方案
1. 完善package.json的exports字段,添加类型映射
原配置仅指定了JS文件路径,未关联对应的类型声明文件。需要为每个子路径同时配置types和default入口:
{ "name": "@myorg/core", "main": "dist/index.js", "types": "dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }, "./Enumerators": { "types": "./dist/enumerators/index.d.ts", "default": "./dist/enumerators/index.js" }, "./ExternalAPIs": { "types": "./dist/external-apis/index.d.ts", "default": "./dist/external-apis/index.js" }, "./DatabaseModels": { "types": "./dist/database-models/index.d.ts", "default": "./dist/database-models/index.js" } } }
2. 确保子目录类型声明文件正确生成
检查tsconfig.json配置,确保编译时为每个子目录的index.ts生成对应的.d.ts文件:
{ "compilerOptions": { "declaration": true, "declarationDir": "./dist", "outDir": "./dist", "rootDir": "./src", // 其他必要配置(如target、module等) }, "include": ["src/**/*"] }
编译后,src下的子目录结构会完整映射到dist目录,确保dist/enumerators/index.d.ts等文件存在。
3. 保持路径大小写一致性
注意导入路径的大小写需与exports配置及实际文件目录一致。例如若实际目录为小写enumerators,建议统一配置为:
"./enumerators": { "types": "./dist/enumerators/index.d.ts", "default": "./dist/enumerators/index.js" }
导入时使用:
import * as Enumerators from '@myorg/core/enumerators';
是否属于最佳实践?
这种子路径按需导入属于TypeScript工具包的最佳实践之一:
- 使用者可按需导入所需模块,减少最终打包体积;
- 包结构清晰,使用者无需了解内部目录即可直接通过子路径访问独立模块;
- 避免因导入整个包导致的不必要依赖加载。
内容的提问来源于stack exchange,提问作者DamiToma
相关产品推荐
相关产品推荐

