如何在服务端与客户端项目间共享TypeScript类型声明?
方案1:使用子路径导出 + 可选依赖配置(零额外维护成本)
这是目前维护成本最低的方案,不需要拆分独立包,只需要调整你的服务端库的配置即可:
- 先把所有要开放的公共类型统一抽离到单独的目录(比如
src/public-types),构建时单独把这部分类型打包成独立的d.ts产物 - 在
package.json中配置exports字段,单独开放类型的导入路径,同时把所有服务端专属的运行时依赖放到optionalDependencies下:
{ "name": "你的服务端库名", "main": "./dist/index.js", // 单独开放类型导入路径 "exports": { ".": "./dist/index.js", "./public-types": { "types": "./dist/public-types/index.d.ts" } }, "optionalDependencies": { // 所有服务端运行时需要的依赖都放这里,比如请求库、Node相关依赖等 "axios": "^1.6.0", "@types/node": "^20.0.0" } }
- 客户端安装时只需要执行
npm install 你的服务端库名 --save-dev,npm会自动跳过可选依赖的安装,最终只有几KB的类型文件被下载,完全不会引入服务端相关的运行时代码,导入时直接使用import type { 对应类型 } from '你的服务端库名/public-types'即可。
方案2:打包单文件类型声明直接复用
如果你完全不想让客户端安装任何npm包,可以用dts-bundle-generator工具把所有公共类型打包成单个d.ts文件共享:
- 安装工具后执行命令:
dts-bundle-generator src/public-types/index.ts -o dist/yelp-fusion-types.d.ts - 生成的d.ts文件可以直接放到客户端项目的
types目录下直接使用,也可以放到内部共享存储中统一维护更新。
方案3:TypeScript项目引用(适合monorepo场景)
如果你的服务端库和客户端项目在同一个monorepo仓库下,可以直接用TS原生的项目引用功能:
- 把公共类型拆成一个独立的TS子项目,不需要发布为npm包
- 在服务端和客户端的
tsconfig.json中分别配置references字段指向这个公共类型子项目即可,修改类型时两边会同步生效,完全没有额外的发包维护成本。
内容的提问来源于stack exchange,提问作者kob490
相关产品推荐
相关产品推荐

