vue 3 中结合 typescript 封装 axios 的核心是让类型贯穿请求全流程:定义泛型 baseresponse 接口统一响应结构,为各接口单独建模数据类型,请求函数支持泛型透传,拦截器确保类型安全与错误处理。

在 Vue 3 中结合 TypeScript 封装 Axios,核心是让接口返回的数据具备可预测的结构和编辑器智能提示。关键不在于“写个接口”,而在于让类型贯穿请求发起、拦截处理、业务调用全过程。
定义通用响应结构接口
后端通常统一返回类似 { code: number, data: T, message: string } 的格式。用泛型接口描述它,就能适配所有业务接口:
-
基础响应类型:明确 code、message、data 三要素,data 使用泛型
T占位,后续可具体化 -
默认泛型值:设
T = any或T = unknown,避免调用时强制传参,提升灵活性
interface BaseResponse<t unknown> {
code: number
message: string
data: T
}</t>
为具体接口定义数据类型
每个 API 返回的数据结构不同,需单独建模。类型越细,TS 提示越准,运行时隐患越少:
- 用户列表接口返回数组 → 定义
UserItem和UserListResponse - 登录接口返回 token 字段 → 单独定义
LoginResponse,继承或组合BaseResponse - 避免直接用
any或Record<string any></string>,否则失去类型意义
interface UserItem {
id: number
name: string
email: string
}
type UserListResponse = BaseResponse<useritem>
interface LoginData {
token: string
expires_in: number
}
type LoginResponse = BaseResponse<logindata></logindata></useritem>
在请求方法中注入类型参数
封装的请求函数(如 request.get())要支持泛型透传,确保最终返回值类型精准:
- 请求函数签名中声明泛型
<t></t>,并用于返回 Promise 类型 - 响应拦截器中统一解包
res.data后,仍保留原始泛型信息,不丢失类型上下文 - 调用时显式传入类型,如
api.getUser<userlistresponse>()</userlistresponse>,或依赖 TS 自动推导
class Request {
request<t>(config: AxiosRequestConfig): Promise<t> {
return service(config).then(res => res.data as T)
}
}
// 调用时获得完整类型提示
const users = await request.get<userlistresponse>('/users')</userlistresponse></t></t>
配合拦截器做类型安全处理
响应拦截器不只是“取 data”,更是类型守门人:
- 当
res.code !== 200时,抛出带 message 的错误,避免业务层收到 undefined data - 对空 data、非预期字段做可选链或断言处理,防止运行时报错
- 若后端返回结构不稳定(如 data 有时是对象有时是 null),用联合类型
T | null或可选属性data?: T显式表达
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











