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

如何从私有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:46:06