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

如何在服务端与客户端项目间共享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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:39:03