如何正确导出TypeScript库类以供外部包继承扩展?
TypeScript库对外暴露类的正确方案
最佳实践:统一入口重导出
解决内部路径依赖问题的核心是把对外API收敛到根入口文件,具体步骤:
- 在
MyPkg的src根目录创建/修改index.ts,重导出需要暴露的MyPkgClass:// src/index.ts export { MyPkgClass } from './path/to/mypkg/MyPkgClass'; // 后续新增对外API都在这里统一导出 - 配置
package.json的入口字段,让Node.js和TypeScript都能正确识别包的入口:{ "main": "./bin/index.js", // CommonJS环境入口 "module": "./bin/index.esm.js", // ES模块入口(可选,优化tree-shaking) "types": "./bin/index.d.ts", // 类型定义文件入口 "exports": { // 现代包推荐的入口配置,覆盖不同模块系统 ".": { "import": "./bin/index.esm.js", "require": "./bin/index.js", "types": "./bin/index.d.ts" } } } - 消费包
OtherPkg直接从包名导入,彻底摆脱内部路径限制:import { MyPkgClass } from 'MyPkg'; export class OtherClass extends MyPkgClass { // 你的扩展逻辑 }
关于类型导出的说明
- 只要你在
tsconfig.json中开启了declaration: true,TypeScript会自动为export的类生成对应的类型定义,不需要额外写export type——仅当导出纯类型(比如接口、类型别名)时才需要用export type。 - 确保
tsconfig.json的类型生成配置正确:{ "compilerOptions": { "declaration": true, // 生成.d.ts文件 "declarationDir": "./bin", // 类型文件输出目录 "outDir": "./bin", // JS文件输出目录 // 其他必要配置:target、module、moduleResolution等 } }
TypeScript官方规范参考
- 官方明确推荐将库的对外API集中到根入口文件,避免消费方依赖内部文件结构,这样后续调整库的内部目录时,不会破坏外部代码。
- 优先使用
package.json的exports字段配置入口,它能更精准地处理不同模块系统的导入逻辑,同时保证类型定义和JS文件的关联一致性。 - 类型定义文件必须和编译后的JS文件路径对应,通过
types字段指定后,消费包导入时TypeScript会自动加载对应的类型信息。
内容的提问来源于stack exchange,提问作者user2054627
相关产品推荐
相关产品推荐

