🚀 自研工具分享:一键生成 TypeScript 接口,告别手写 API 的繁琐

72 阅读7分钟

“每次对接后端接口,都要手写一遍 TypeScript 类型定义,谁懂啊?🤯” —— 一个被 API 反复折磨的前端仔

前言:每个前端都懂的痛 😣

你是不是也遇到过这种窒息场景:

后端甩来一份 50+ 接口的 Swagger 文档,你默默打开 VS Code 开启“手抄模式”📝:逐个定义接口返回类型、编写请求方法,每个接口字段少则十几个,多则几十上百个。一整天下来,吭哧吭哧才搞定 10 个,大量时间全耗在这种重复又没技术含量的活上,主打一个“感动自己,效率为零”。

// 第 1 个接口...
export interface UserResponse {
  id: number;
  name: string;
  email: string;
  // ... 还有 20 多个字段要写
}

export function getUser() {
  return request.get<UserResponse>('/api/user');
}

// 第 2 个接口...
export interface OrderResponse {
  orderId: string;
  // ... 又是一堆字段等着抄
}

// 第 3 个...
// 第 4 个...
// 🤯 心态崩了,不想写了!

一天过去,你只写了 10 个接口。

作为追求“高效摸鱼”(本质是懒得动手)的程序员,我直接自己造了个工具解决这个痛点——go-gen 就此诞生✨

go-gen 是什么?🤔

一句话总结:一款能自动生成 TypeScript 接口代码的 CLI 工具。只需甩给它 API 地址或 Swagger 文档,它就能一键生成完整的类型定义和请求方法,从此和手写 TS 类型说拜拜👋

安装超简单 🛠️

# 全局安装(npm 党)
npm install -g @gogenger/go-gen

# 或者 yarn 党专属
yarn global add @gogenger/go-gen

功能 1:Fetch 模式 - 日常单接口神器 ✨

场景:对接单个用户信息接口

假设后端给了你一个接口:https://api.example.com/users/123

传统做法:步骤多到崩溃 😫

# 1. 打开 Postman 测试接口
# 2. 复制返回的 JSON 数据
# 3. 切回 VSCode 手动写类型
# 4. 再手写请求方法
# 5. 中途还可能抄错字段,反复核对
# 6. 累了,喝杯咖啡缓一缓 ☕

用 go-gen:30 秒搞定 ✅

$ go-gen fetch

跟着提示一步步来,傻瓜式操作:

🌐 请输入 API URL: https://api.example.com/users/123
🔧 请求方法: GET
🔐 是否需要认证? 不需要
📄 Response Type 名称: UserResponse
📦 API 方法名: getUser
📂 输出目录: 📁 当前目录

🚀 请求 API 数据中...
✅ API 数据获取完成
🧠 生成 TypeScript 类型...
✅ Response 类型生成完成
🎉 文件生成成功!

生成的代码长这样👇

types.ts

export interface UserResponse {
  id: number;
  name: string;
  email: string;
  avatar: string;
  role: string;
  createdAt: string;
}

api.ts

import request from '@/utils/request';
import type { UserResponse } from './types';

export function getUser() {
  return request.get<UserResponse>('https://api.example.com/users/123');
}

全程不用手写一个字段,爽到飞起!🎉

进阶:带认证的接口也能搞定 🔐

很多接口需要登录才能访问,别慌,go-gen 早考虑到了!

$ go-gen fetch

🌐 请输入 API URL: https://api.example.com/profile
🔧 请求方法: GET
🔐 是否需要认证? Bearer Token
🔑 请输入 Bearer Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...}

它会自动带上 Authorization 请求头去调用接口,认证问题一键解决,不用额外操心~

再进阶:POST 请求带请求体也能生成 📥

对于 POST/PUT/PATCH 这类需要传请求体的接口,go-gen 会自动生成 Request 类型,贴心到哭!

$ go-gen fetch

🌐 请输入 API URL: https://api.example.com/users
🔧 请求方法: POST
🔐 是否需要认证? Bearer Token
🔑 请输入 Bearer Token: your_token_here
📦 该接口是否需要请求体? Yes
📝 请输入请求体 JSON: {"name": "张三", "email": "zhangsan@example.com"}

生成的代码直接能用:

// types.ts
export interface CreateUserRequest {
  name: string;
  email: string;
}

export interface CreateUserResponse {
  id: number;
  name: string;
  email: string;
  createdAt: string;
}

// api.ts
export function createUser(data: CreateUserRequest) {
  return request.post<CreateUserResponse>('https://api.example.com/users', data);
}

是不是超省心?😎

功能 2:OpenAPI 模式 - 批量生成救星 🚀

场景:面对 50+ 接口的 Swagger 文档

如果接口数量多到爆炸,Fetch 模式逐个处理就有点费劲儿了。这时候,OpenAPI 模式 直接封神!

# 在线 Swagger 文档
$ go-gen openapi https://api.example.com/swagger.json

# 本地 Swagger 文件也支持
$ go-gen openapi ./swagger.json

两种生成模式,按需选择 ✨

模式 1:逐个生成(精细控制)

适合想自定义每个接口名称、追求细节的场景:

🔍 发现接口: GET /users
📝 Response Type 名称: UserListResponse
📦 API 方法名: getUserList
✨ 生成成功!

🔍 发现接口: POST /users
📝 Response Type 名称: CreateUserResponse
📦 API 方法名: createUser
✨ 生成成功!

模式 2:批量生成(一键梭哈)

适合赶进度、想快速生成所有接口的场景,效率直接拉满:

⚡ 批量生成中... (1/50): GET /users
⚡ 批量生成中... (2/50): POST /users
⚡ 批量生成中... (3/50): GET /users/{id}
...
✅ 批量生成完成!成功: 50,失败: 0

喝杯茶的功夫,50 个接口全部搞定,摸鱼时间又多了!🍵

功能 3:智能增量写入 - 不怕覆盖旧代码 📝

场景:新增接口,不想动已有的代码

假设你已经生成过一批接口,现在要加新接口。传统做法是小心翼翼地往文件里追加代码,生怕手抖覆盖旧内容;而 go-gen 直接帮你搞定!

# 第一次生成
$ go-gen fetch
# 生成了 getUser() 和 UserResponse

# 第二次生成到同一目录
$ go-gen fetch
# 选择相同的输出目录
# 生成了 createUser() 和 CreateUserRequest

# 结果:两个方法和平共处,互不打扰 🤝

最终文件效果:

// api.ts
import request from '@/utils/request';
import type { UserResponse, CreateUserRequest } from './types';

// 第一次生成的,完好保留
export function getUser() {
  return request.get<UserResponse>('/api/user');
}

// 第二次生成的,自动追加进来
export function createUser(data: CreateUserRequest) {
  return request.post<CreateUserResponse>('/api/user', data);
}

不会覆盖、不会冲突,智能得一批!🧠

功能 4:类型冲突自动处理 - 再也不用手动改名 ✅

场景:不小心重复定义了类型名

有时候会遇到这种情况:第一次生成了 ApiResponse 类型,第二次又想生成同名类型,传统工具要么报错要么覆盖,还要手动改一堆名字。

而 go-gen 会自动处理所有关联类型,连嵌套类型都不放过!

# 第一次生成:ApiResponse
$ go-gen fetch
# 生成: ApiResponse { data: Data }

# 第二次又要生成 ApiResponse
$ go-gen fetch
# 输入相同的类型名

⚠️  检测到类型名冲突,已自动重命名所有相关类型:
   ApiResponseApiResponse1
   包含类型: ApiResponse1, Data1, Metadata1

✨ 生成成功!(类型已重命名为 ApiResponse1,包含所有嵌套类型)

生成的代码自动规避冲突:

// types.ts

// 第一次生成的,完全不变
export interface ApiResponse {
  data: Data;
}

export interface Data {
  key1: string;
  key2: string;
}

// 第二次生成的,所有嵌套类型都自动重命名
export interface ApiResponse1 {
  data: Data1;  // ← 自动改成 Data1,避免冲突
}

export interface Data1 {
  id: number;   // ← 新字段
  key1: string;
  key2: string;
}

连嵌套类型都考虑到了,这个功能我调试了好久才搞定,谁用谁夸!😅

功能 5:双层配置系统 - 适配不同项目和团队 🤝

场景:不同项目用不同的 request 库

实际开发中,不同项目可能用不同的 HTTP 工具:项目 A 用 axios、项目 B 用自定义 request 工具、项目 C 用原生 fetch。传统做法是生成代码后手动改 import,麻烦到炸!

go-gen 支持「全局配置 + 项目配置」,自动适配不同场景,团队协作也能统一风格!

全局配置(个人习惯专属)

$ go-gen config --global

生成的 ~/.apirc.json 配置文件:

{
  "timeout": 15000, // 接口请求超时时间
  "maxRetries": 5,  // 失败自动重试次数
  "defaultOutputPath": "desktop"  // 默认输出路径
}

项目配置(团队规范专用)

$ cd your-project
$ go-gen init

生成的项目根目录 .apirc.json 配置文件:

{
  "requestModule": "@/api/request", // 项目统一的请求工具路径
  "typePrefix": "I", // 类型名统一前缀
  "apiPrefix": "api" // 接口方法名统一前缀
}

配置优先级:项目配置 > 全局配置 > 默认配置

生成的代码会自动适配项目配置,无需手动修改:

import request from '@/api/request';  // ← 自动用项目配置的路径
import type { IUserResponse } from './types';  // ← 自动加前缀 I

export function apiGetUser() {  // ← 自动加前缀 api
  return request.get<IUserResponse>('/api/user');
}

团队协作再也不用为代码风格吵架了!👥

功能 6:自动重试 + 友好提示 - 不怕网络坑 🛡️

场景:网络不稳定或接口偶尔抽风

go-gen 内置自动重试机制,网络波动也不怕,不用手动重新执行命令:

🚀 请求 API 数据中...
⚠️  请求失败 (尝试 1/3),2秒后重试...
⚠️  请求失败 (尝试 2/3),2秒后重试...
✅ API 数据获取完成

而且错误提示特别友好,不会让你一脸懵:

 请求失败: HTTP 401: Unauthorized
💡 提示: 请检查 Token 是否正确

精准定位问题,少走很多弯路!😊

功能 7:随时取消 - 不用傻等 ⏹️

场景:请求太慢或输错了参数

在请求过程中,只要按 Ctrl+C 就能随时取消,不用硬等结束:

💡 提示: 请求过程中可以按 Ctrl+C 取消

🚀 请求 API 数据中...
^C
⚠️  请求已被取消

提示: 您可以重新开始或退出

灵活又省心,不用为输错参数买单!🙅

实战案例:10 分钟对接电商用户模块 🛒

用一个真实场景演示完整流程,看看 go-gen 到底能省多少时间!

需求:对接电商项目用户模块 5 个接口

  1. 获取用户列表
  2. 获取单个用户详情
  3. 创建用户
  4. 更新用户信息
  5. 删除用户

传统做法:手写 5 个接口,至少 30-60 分钟;用 go-gen:10 分钟搞定,还零错误!

步骤 1:初始化项目配置

$ cd my-ecommerce-project
$ go-gen init

📝 创建项目配置...
✨ 配置文件已创建: .apirc.json

编辑配置文件,适配项目规范:

{
  "requestModule": "@/utils/request",
  "typePrefix": "I",
  "apiPrefix": ""
}

步骤 2:批量生成接口

$ go-gen openapi https://api.myshop.com/swagger.json

📥 正在加载 OpenAPI 文档...
✅ 文档加载成功

发现 5 个接口:
  GET    /users
  GET    /users/{id}
  POST   /users
  PUT    /users/{id}
  DELETE /users/{id}

🎯 选择生成模式:
  ❯ 批量生成(自动命名)
    逐个生成(自定义名称)

⚡ 批量生成中... (1/5): GET /users
⚡ 批量生成中... (2/5): GET /users/{id}
⚡ 批量生成中... (3/5): POST /users
⚡ 批量生成中... (4/5): PUT /users/{id}
⚡ 批量生成中... (5/5): DELETE /users/{id}

✅ 批量生成完成!成功: 5,失败: 0
📂 输出目录: /my-ecommerce-project/getUserList

步骤 3:直接用生成的代码开发

生成的 types.ts 包含所有接口的类型定义,api.ts 包含所有请求方法,TypeScript 自动提示、类型检查全部生效,直接上手用!

// pages/UserList.vue
import { getUserList } from '@/api/user/api';

const loadUsers = async () => {
  const response = await getUserList();
  // TypeScript 自动提示字段,不怕写错!
  console.log(response.data); // IUser[] 类型
  console.log(response.total); // number 类型
};

开发效率直接翻倍,摸鱼时间这不就来了!✨

使用技巧和最佳实践 📚

技巧 1:团队协作规范化

在项目根目录创建 .apirc.json 配置文件,统一代码风格,提交到 Git 仓库,团队成员生成的代码就完全一致了:

git add .apirc.json
git commit -m "chore: add go-gen config"

技巧 2:合理组织目录结构

建议按业务模块划分目录,清晰又好维护:

src/api/
├── user/          # 用户模块
│   ├── api.ts     # 接口方法
│   └── types.ts   # 类型定义
├── order/         # 订单模块
│   ├── api.ts
│   └── types.ts
└── product/       # 商品模块
    ├── api.ts
    └── types.ts

技巧 3:统一命名规范

  • 类型名:PascalCase + 后缀(Response/Request),比如 UserResponse、CreateOrderRequest
  • API 方法名:camelCase + 动词前缀,比如 getUserList、createOrder

技巧 4:增量开发更高效

每次新增接口时,选择已有的模块目录,go-gen 会自动追加代码,不用手动复制粘贴,也不怕覆盖旧代码。

常见问题 Q&A ❓

  • Q:支持哪些 HTTP 方法? A:支持 GET、POST、PUT、DELETE、PATCH 五种常用方法。
  • Q:支持 GraphQL 吗? A:目前只支持 REST API 和 OpenAPI(Swagger),暂不支持 GraphQL。
  • Q:生成的代码可以自定义吗? A:可以通过配置文件调整请求模块路径、类型前缀、输出目录等,满足不同项目需求。
  • Q:支持哪些认证方式? A:目前支持 Bearer Token 和 Cookie 两种常用认证方式。
  • Q:接口返回格式不规范怎么办? A:go-gen 会尽力解析数据,但建议和后端约定好规范格式,生成的类型会更精准。

总结 📌

go-gen 帮你解决这些痛点:

  • ✅ 告别手写 TypeScript 类型的繁琐
  • ✅ 无需手动编写重复的 API 请求方法
  • ✅ 支持单接口生成和批量生成,效率拉满
  • ✅ 智能处理类型冲突、增量写入,减少手动操作
  • ✅ 支持团队配置,统一代码风格

适用场景:

前端对接 REST API、从 Swagger 文档生成代码、团队协作开发、快速原型开发,都能用它大幅提升效率!

不适用场景:

需要复杂自定义逻辑、特殊数据结构处理、深度定制代码的场景,建议生成基础代码后再手动优化。

最后想说的话 💬

如果你也经常被手写 TS 类型折磨,不妨试试 go-gen,相信能帮你省下不少时间摸鱼(不是)开发!

如果觉得好用,欢迎给个 ⭐️ Star 支持一下,这对我很重要!有问题或需求也欢迎提 Issue,我会尽快回复和迭代功能。

工具地址:github.com/goGenger/go…

Happy Coding! 🎉

P.S. 这个工具是我某个周末为了摆脱重复工作写的,越写越上瘾,就慢慢迭代成了现在的样子。如果你有好的建议或想要的功能,欢迎随时告诉我!