swagger-typescript-api
swagger-typescript-api 是一个专为 TypeScript 设计的 工具,支持从 Swagger/OpenAPI 文档生成 TypeScript 类型定义和 API 客户端代码,支持按 OpenAPI tags 自动分割生成多个文件。
工具说明
核心特性
- 按 tags 分割:支持
--module-first或modular: true,按 OpenAPI tags 组织文件 - 灵活配置:可以只生成类型,也可以生成 API 客户端代码
- 专为 TypeScript 设计:支持 Axios/Fetch,对前端开发友好
- 支持 Swagger 2.0:原生支持 Swagger 2.0,无需转换
适用场景
- 需要按 tags 分割生成多个文件
- 希望生成轻量级的类型定义和 API 封装
- 需要灵活的配置选项
安装
npm install -D swagger-typescript-api
使用方式
后端 Makefile 配置
FRONT_TYPES_DIR ?= ./frontend-types
generate-front-types-swagger-api: swagger ## 生成前端TypeScript类型定义(按tags分割,使用swagger-typescript-api)
@echo "generating frontend types to $(FRONT_TYPES_DIR) using swagger-typescript-api..."
@mkdir -p $(FRONT_TYPES_DIR)
@rm -rf $(FRONT_TYPES_DIR)/* 2>/dev/null || true
docker run --rm \
-v $(PWD)/docs/swagger.yaml:/swagger.yaml:ro \
-v $(PWD)/$(FRONT_TYPES_DIR):/output \
node:20-alpine sh -c "\
npm install -g swagger-typescript-api && \
swagger-typescript-api generate \
--path /swagger.yaml \
--output /output \
--modular \
--module-name-first-tag"
@echo "Frontend types generated to $(FRONT_TYPES_DIR) (split by tags)"
@echo "Note: API files are split by tags, but data-contracts.ts contains all types"
关键配置说明:
node:20-alpine:需要 Node.js 20+ 版本(工具依赖需要)generate:必须指定generate命令--modular:启用模块化输出--module-name-first-tag:按第一个 tag 分割生成多个 API 文件- 注意:使用
--no-client时不会按 tags 分割,只生成单个data-contracts.ts文件
配置文件方式
创建 swagger-typescript-api.config.ts:
import { GenerateApiParams } from 'swagger-typescript-api';
export default {
path: './docs/swagger.yaml',
output: './frontend-types',
modular: true, // 按 tags 分割生成多个文件
moduleNameFirstTag: true, // 按第一个 tag 分割(与 --module-name-first-tag 对应)
httpClientType: 'axios', // 或 'fetch'
} as GenerateApiParams;
基础配置说明:
modular:启用模块化输出,按 tags 分割生成多个文件moduleNameFirstTag:按第一个 tag 分割生成多个 API 文件httpClientType:选择 HTTP 客户端类型(axios或fetch)
更多配置选项请参考下面的"配置文件完整选项"部分。
生成结果
会根据 OpenAPI 的 tags 生成多个 API 文件,但类型定义文件不分割:
frontend-types/
├── UserApi.ts # 用户相关 API(按 tag 分割)
├── AuthApi.ts # 认证相关 API(按 tag 分割)
├── RoleApi.ts # 角色相关 API(按 tag 分割)
├── PermissionApi.ts # 权限相关 API(按 tag 分割)
├── MenuApi.ts # 菜单相关 API(按 tag 分割)
├── OrderApi.ts # 订单相关 API(按 tag 分割)
├── ProductApi.ts # 产品相关 API(按 tag 分割)
├── data-contracts.ts # 所有类型定义(不分割,包含所有类型)
└── http-client.ts # HTTP 客户端
文件分割说明:
- API 文件:按 OpenAPI tags 自动分割生成多个文件,每个 tag 对应一个文件
- 类型定义文件:
data-contracts.ts包含所有类型定义,不按 tags 分割 - HTTP 客户端:
http-client.ts提供基础的 HTTP 请求封装
生成文件示例
UserApi.ts(按 tag 分割的 API 文件):
import {
UserInfoResponse,
UserListResponse,
CreateUserRequest,
UpdateUserRequest,
// ... 其他类型
} from "./data-contracts";
import { ContentType, HttpClient, RequestParams } from "./http-client";
export class UserApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
/**
* @description 获取用户信息
* @tags User
*/
getUserInfo = (params: RequestParams = {}) =>
this.request<UserInfoResponse>({
path: `/api/v1/users/{id}`,
method: "GET",
...params,
});
/**
* @description 获取用户列表
* @tags User
*/
getUserList = (params: RequestParams = {}) =>
this.request<UserListResponse>({
path: `/api/v1/users`,
method: "GET",
...params,
});
// ... 其他 API 方法
}
data-contracts.ts(所有类型定义):
export interface UserInfo {
id: number;
username: string;
email: string;
role: string;
createdAt: string;
}
export interface UserInfoResponse {
code: number;
msg: string;
data: UserInfo;
}
export interface UserListResponse {
code: number;
msg: string;
data: {
list: UserInfo[];
total: number;
};
}
export interface CreateUserRequest {
username: string;
email: string;
password: string;
role: string;
}
export interface LoginRequest {
username: string;
password: string;
}
export interface LoginResponse {
code: number;
msg: string;
data: {
token: string;
userId: number;
expireAt: number;
};
}