← [ BACK_TO_NOTES ]

前后端共享类型契约

Monorepo 中前后端共享类型的设计:packages/contracts 包定义 API 契约,编译时发现不一致。

#concept #growing #eng

[!info] related notes

前后端共享类型契约

核心问题

前端定义 interface User { id: string; name: string },后端返回 { id: "123", username: "test" }——字段名不一致,运行时才发现。

解决方案

在 packages/contracts 中定义共享类型:

// packages/contracts/src/consultation.ts
export interface ConsultationSession {
  id: string;
  user_id: string;
  messages: ConsultationMessage[];
  status: 'in_progress' | 'completed';
  phase: ConsultationPhase;
}

前端直接 import:

import type { ConsultationSession } from '@bodysense/contracts';

package.json

{
  "name": "@bodysense/contracts",
  "main": "./src/index.ts",
  "types": "./src/index.ts"
}

直接指向源码,monorepo 内不需要编译。

与 Go 类型的对应

TypeScript contracts 和 Go struct 的 JSON tag 需要手动保持一致。更高级的方案可以用代码生成工具(如 openapi-generator)自动同步。

与 tRPC/OpenAPI 的对比

方案复杂度适用
手动 contracts低Go + React
tRPC中Node 全栈
OpenAPI codegen高任意语言

Go + React 的组合用 contracts 包最简单。

创建于 2026/6/25 更新于 2026/7/15
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本