在npm工作区中共享TypeScript类型定义的最佳方案
在npm工作区中共享TypeScript类型定义的最佳方案
嘿,我刚好碰到过和你几乎一样的场景,给你几个实用的解决方案,不用非得写类定义来绕弯子:
方案1:调整common库的TypeScript配置,让.d.ts文件被正确识别和输出
默认情况下,如果你只是把.d.ts文件丢在common库里,TS构建可能不会把它们纳入输出,或者其他项目找不到这些类型。你可以这么改:
- 在common库的
tsconfig.json里确保开启声明文件输出:
{ "compilerOptions": { "declaration": true, // 生成对应的.d.ts文件 "outDir": "./dist", // 指定输出目录 // 其他配置... }, "include": [ "src/**/*", "src/**/*.d.ts" // 明确包含你的类型定义文件 ] }
- 然后在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库中安装这个包,然后重新导出它的类型:
- 在common库中安装依赖:
npm install @external/api-types
- 在common库的
src/index.ts里导出这些类型:
export * from '@external/api-types';
这样你的两个app项目只需要依赖common库,就能间接拿到外部API的类型,不用每个app都单独安装那个外部包。
这些方法都能帮你干净地共享类型定义,不用被迫写冗余的类。我自己用方案2最多,因为它最直观,和普通代码的导出方式一致,维护起来也方便。
备注:内容来源于stack exchange,提问作者stakolee
相关产品推荐
相关产品推荐

