“每次对接后端接口,都要手写一遍 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
# 输入相同的类型名
⚠️ 检测到类型名冲突,已自动重命名所有相关类型:
ApiResponse → ApiResponse1
包含类型: 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 个接口
- 获取用户列表
- 获取单个用户详情
- 创建用户
- 更新用户信息
- 删除用户
传统做法:手写 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,我会尽快回复和迭代功能。
Happy Coding! 🎉
P.S. 这个工具是我某个周末为了摆脱重复工作写的,越写越上瘾,就慢慢迭代成了现在的样子。如果你有好的建议或想要的功能,欢迎随时告诉我!