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

在npm工作区中共享TypeScript类型定义的最佳方案

在npm工作区中共享TypeScript类型定义的最佳方案

嘿,我刚好碰到过和你几乎一样的场景,给你几个实用的解决方案,不用非得写类定义来绕弯子:

方案1:调整common库的TypeScript配置,让.d.ts文件被正确识别和输出

默认情况下,如果你只是把.d.ts文件丢在common库里,TS构建可能不会把它们纳入输出,或者其他项目找不到这些类型。你可以这么改:

  1. 在common库的tsconfig.json里确保开启声明文件输出:
{
  "compilerOptions": {
    "declaration": true, // 生成对应的.d.ts文件
    "outDir": "./dist", // 指定输出目录
    // 其他配置...
  },
  "include": [
    "src/**/*",
    "src/**/*.d.ts" // 明确包含你的类型定义文件
  ]
}
  1. 然后在common库的package.json里指定类型入口文件,让其他项目能找到类型:
{
  "name": "@your-monorepo/common",
  "main": "./dist/index.js",
  "types": "./dist/index.d.ts", // 指向生成的类型入口
  // 其他配置...
}

如果你的.d.ts是单独的文件(比如api-types.d.ts),可以在src/index.ts里把它们导出:

// src/index.ts
export * from './api-types.d.ts';

这样构建后,dist/index.d.ts就会包含这些类型,其他项目直接从@your-monorepo/common导入即可。

方案2:把类型定义写在普通.ts文件中导出

其实不用非得用.d.ts文件,你可以直接在common库的.ts文件里定义interface或type然后导出,TS在构建时会自动生成对应的.d.ts文件。比如:

// src/api-types.ts
export interface ApiResponse {
  code: number;
  data: any;
  message: string;
}

export type UserRole = 'admin' | 'user' | 'guest';

然后在src/index.ts里统一导出:

export * from './api-types';

这样其他项目就能像导入普通代码一样导入这些类型:

import { ApiResponse, UserRole } from '@your-monorepo/common';

这种方式比单独维护.d.ts更省心,TS会自动处理类型的生成和导出。

方案3:直接引入外部API的类型包(如果有的话)

如果你的外部API仓库已经发布了包含类型定义的npm包,你可以直接在common库中安装这个包,然后重新导出它的类型:

  1. 在common库中安装依赖:
npm install @external/api-types
  1. 在common库的src/index.ts里导出这些类型:
export * from '@external/api-types';

这样你的两个app项目只需要依赖common库,就能间接拿到外部API的类型,不用每个app都单独安装那个外部包。

这些方法都能帮你干净地共享类型定义,不用被迫写冗余的类。我自己用方案2最多,因为它最直观,和普通代码的导出方式一致,维护起来也方便。

备注:内容来源于stack exchange,提问作者stakolee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:09:50