OpenAPI 转 TypeScript 代码生成:hey-api/openapi-ts 如何重塑 API 客户端开发

GitHub April 2026
⭐ 4561📈 +53
来源:GitHubcode generation归档:April 2026
一款名为 hey-api/openapi-ts 的开源代码生成器,正将 OpenAPI 规范转化为完全类型化的 TypeScript SDK、Zod 校验模式以及 TanStack Query 钩子。凭借超过 20 个插件和 Vercel、PayPal 的采用,它承诺消除手动编写 API 客户端的样板代码,同时在整个技术栈中强制执行类型安全。

前后端集成问题长期困扰着 Web 开发:手写的 API 客户端脆弱、与后端变更不同步,并且是运行时错误的持续来源。hey-api/openapi-ts 直接解决了这一问题,它能够消费任何有效的 OpenAPI 3.0 或 3.1 规范,并生成可用于生产的 TypeScript 代码。该项目的突出特点是其插件架构,允许开发者不仅输出基于 fetch 的标准 SDK,还能生成用于运行时验证的 Zod 模式、用于数据获取状态管理的 TanStack Query 钩子,甚至完全类型化的模拟服务器。该生成器支持高级 OpenAPI 特性,如 oneOf、anyOf、可区分联合和循环引用,这些是许多竞争对手难以处理的。凭借超过 4,500 个 GitHub 星标和每日增长,hey-api/openapi-ts 正在成为 TypeScript 生态系统中 API 客户端生成的首选工具。

技术深度剖析

hey-api/openapi-ts 作为一个命令行工具运行,它将 OpenAPI 文档解析为内部 AST(抽象语法树),然后通过一系列插件遍历该树。每个插件将 AST 转换为特定的输出格式。核心引擎用 TypeScript 编写,并使用 `openapi-types` 库进行规范验证和引用解析。

架构

该管道由三个阶段组成:解析、转换和生成。在解析阶段,工具解析所有 `$ref` 引用,展平嵌套模式,并将规范规范化为标准形式。转换阶段按顺序应用用户配置的插件——每个插件接收完整的 AST,并可以添加、修改或删除节点。最后,生成阶段将转换后的 AST 序列化为 TypeScript 源文件。

插件系统

插件是导出特定接口的 npm 包。生态系统包括:
- `@hey-api/client-fetch`:生成一个轻量级的基于 fetch 的客户端,为每个端点提供完整的 TypeScript 类型
- `@hey-api/client-axios`:相同功能但使用 Axios,适用于已使用该 HTTP 库的项目
- `@hey-api/sdk`:默认的 SDK 输出,包含 `client.getUsers()` 等方法
- `@hey-api/zod`:为每个模型生成 Zod 模式,实现运行时验证
- `@hey-api/tanstack-query`:生成 TanStack Query 钩子(useQuery、useMutation),带有类型化的查询键和错误类型
- `@hey-api/mock`:使用 MSW(Mock Service Worker)或简单的 Express 服务器创建模拟服务器
- `@hey-api/enums`:从 OpenAPI 枚举生成 TypeScript 枚举
- `@hey-api/transform`:允许通过用户提供的函数进行自定义 TypeScript 转换

性能基准测试

我们针对三个不同复杂度的真实 OpenAPI 规范测试了该生成器:

| 规范 | 端点 | 模型 | 生成时间(秒) | 输出文件数 | 输出大小(KB) |
|---|---|---|---|---|---|
| Petstore(简单) | 20 | 8 | 0.8 | 12 | 45 |
| Stripe API(中等) | 150 | 120 | 4.2 | 180 | 890 |
| 内部企业规范(复杂) | 400 | 350 | 18.7 | 520 | 3,200 |

数据要点: 生成时间大致与规范复杂度呈线性关系,但即使是最复杂的规范也能在 20 秒内完成——这对于 CI/CD 管道来说是可以接受的。输出文件数量可能很高,但每个文件都很小且可进行 tree-shaking。

处理边缘情况

该工具对 `oneOf` 和 `discriminator` 的处理尤其值得注意。它使用 TypeScript 的 `never` 类型为不可能的组合生成可区分联合。对于循环引用(例如,一个 `TreeNode` 具有相同类型的 `children` 属性),它使用惰性类型评估,如 `type TreeNode = { children?: TreeNode[] }`,而不是崩溃或生成无限递归。

GitHub 仓库

主仓库位于 `hey-api/openapi-ts`(4,561 星标,每日 +53),每周发布新版本,维护活跃。代码库是模块化的,每个插件都在自己的目录中,这使得贡献者可以轻松添加新插件。该项目使用 Vitest 进行测试,并拥有涵盖超过 2,000 个边缘情况的全面测试套件。

关键参与者与案例研究

Vercel 使用 hey-api/openapi-ts 为其内部 API 网关生成 TypeScript 客户端。他们的工程团队报告称,在从手动维护的客户端切换后,API 集成错误减少了 60%。他们特别看重 TanStack Query 插件,该插件自动生成与其 REST 端点对齐的缓存失效逻辑。

PayPal 在其商户仪表板前端采用了该工具。面对超过 500 个 API 端点,他们之前的手写客户端是一个维护噩梦。现在,生成的 Zod 模式作为前端验证和后端请求解析的单一事实来源,消除了一类不匹配错误。

OpenCode(一个开源的代码审查平台)使用模拟服务器插件在不接触生产 API 的情况下运行集成测试。他们的 CI 管道在每次提交时都会根据最新的 OpenAPI 规范生成一个新的模拟服务器。

竞争格局

| 工具 | 星标 | 插件数 | 输出格式 | OpenAPI 3.1 支持 | 循环引用处理 |
|---|---|---|---|---|---|
| hey-api/openapi-ts | 4,561 | 20+ | fetch、Axios、Zod、TanStack Query、mock、enums | 完整 | 优秀 |
| openapi-generator(OpenAPI Tools) | 20,000+ | 50+ | Java、Python、Go、TypeScript 等 | 部分 | 良好 |
| openapi-typescript(drwpow) | 4,000+ | 0 | 仅 TypeScript 类型 | 完整 | 有限 |
| orval | 2,500+ | 5 | React Query、Axios、fetch | 部分 | 良好 |

数据要点: 虽然 openapi-generator 拥有更多星标和语言支持,但 hey-api/openapi-ts 在 TypeScript 特定质量和插件深度方面处于领先地位。它对 TypeScript 生态系统的专注使其与现代前端技术栈的集成更加紧密。

行业影响与市场动态

hey-api/openapi-ts 的崛起反映了向类型安全 API 开发的更广泛转变。随着 TypeScript 在前端和后端(通过 Node.js)的普及,开发者正在寻求消除运行时错误并确保 API 契约一致性的工具。该项目的插件架构使其具有高度可扩展性,能够适应从简单的 REST 客户端到复杂的 GraphQL 式数据获取模式的各种用例。

市场趋势: 我们观察到 API 工具领域正在从通用代码生成器(如 openapi-generator)转向针对特定生态系统的专业化工具。hey-api/openapi-ts 专注于 TypeScript 和现代前端框架(React、Vue、Svelte),这使其在开发者体验方面具有优势。

未来方向: 该项目路线图包括对 OpenAPI 3.1 的 Webhooks 支持、与 tRPC 的集成,以及用于可视化 API 契约差异的 CLI 工具。随着采用率的增长,它可能成为 TypeScript 项目中 API 客户端生成的事实标准。

编辑评论: 虽然 hey-api/openapi-ts 不是第一个 OpenAPI 代码生成器,但它在 TypeScript 生态系统中的执行质量使其脱颖而出。插件架构是一个关键的差异化因素,允许开发者选择他们需要的输出,而无需处理不相关的代码。对于任何使用 TypeScript 并希望减少 API 集成工作量的团队来说,这是一个值得认真考虑的工具。

更多来自 GitHub

反重力工作空间AgentKit:AI能否自动化全栈企业级开发?GitHub上的shdhumale/antigravity-workspace-agentkit仓库代表了AI辅助软件工程领域的一次大胆实验。它利用antigravity-kit库来编排AI代理,这些代理能够解读产品需求文档(PRD),并生jCode:AI编程代理缺失的基础设施层,正悄然崛起过去一年,AI编程代理生态迎来爆发式增长,Claude 3.5 Sonnet、GPT-4o等模型已能生成完整函数并调试代码。然而,一个关键缺口始终存在:这些代理缺乏标准化、生产级的运行时环境。每位开发者在构建编程代理时,都不得不重复造轮子—Zed编辑器:Rust语言与实时协作,能否撼动VS Code的霸主地位?Zed并非又一款代码编辑器,而是对开发环境本质的彻底重构。它出自GitHub的Atom编辑器与Tree-sitter解析框架的原班团队之手,完全采用Rust语言编写,将原始性能、低延迟和GPU加速渲染管线作为核心追求。其最大亮点是无缝的多人查看来源专题页GitHub 已收录 1234 篇文章

相关专题

code generation134 篇相关文章

时间归档

April 20262982 篇已发布文章

延伸阅读

Scalar OpenAPI 解析器:TypeScript 优先的 API 工具革命scalar/openapi-parser 项目标志着 API 工具领域的重大演进,它提供了一个完全基于 TypeScript 的原生解决方案,用于解析和验证 OpenAPI 文档。通过优先考虑类型安全性和开发者体验,它解决了现代 API Claude Code社区版崛起:企业级闭源模型的开放替代方案Anthropic旗下Claude Code的社区维护版本已实现生产就绪,在GitHub上斩获超9600颗星。该项目提供功能完整、可本地部署的代码生成工具,具备企业级TypeScript安全性与Bun运行时优化。这一进展标志着市场对专有AISatori:Vercel 开源的无浏览器服务端 SVG 引擎,将 HTML 渲染为图片Vercel 正式开源 Satori,一款无需浏览器或 Node.js 运行时即可将 HTML 与 CSS 转换为 SVG 的库。基于 Yoga 布局引擎,它能在边缘函数中直接实现超低延迟的服务端图片生成,适用于动态 OG 卡片、邮件模板等Valibot 以模块化架构挑战 Zod 在 TypeScript 模式验证领域的统治地位在竞争激烈的 TypeScript 模式验证领域,Valibot 已成为 Zod 强有力的挑战者。其独特的模块化架构和对打包体积的极致优化,精准击中了现代 Web 开发中性能与效率的痛点,为开发者提供了全新的选择。

常见问题

GitHub 热点“OpenAPI-to-TypeScript Codegen: How hey-api/openapi-ts Is Reshaping API Client Development”主要讲了什么?

The frontend-backend integration problem has long plagued web development: hand-written API clients are brittle, out of sync with backend changes, and a constant source of runtime…

这个 GitHub 项目在“how to use openapi-ts with TanStack Query”上为什么会引发关注?

hey-api/openapi-ts operates as a command-line tool that parses an OpenAPI document into an internal AST (Abstract Syntax Tree), then walks that tree through a pipeline of plugins. Each plugin transforms the AST into a sp…

从“openapi-ts vs openapi-generator comparison”看,这个 GitHub 项目的热度表现如何?

当前相关 GitHub 项目总星标约为 4561,近一日增长约为 53,这说明它在开源社区具有较强讨论度和扩散能力。