前言
- 现在我接触的前端项目都是在用
axios 发请求的。在使用 JS 的时候,不用管类型, 我们直接使用即可,但是在使用 TS 开发的时候,axios 这块我自己觉得还是挺重要的,封装好 axios 之后(包括:拦截器、token过期、业务失败的处理、尤其是 类型设置(我们使用响应回来的数据的时候,直接点的时候会有提示,很舒服,也避免一些类型错误),在我们后面的开发中会很方便);

一、安装、配置axios
1.1 安装 axios
1.2 配置 axios
axios配置的文件位置:src/utils/request/index.ts
import axios from 'axios';
import { useUserStore } from '@/src/stores';
import { showToast } from 'vant';
import router from '@/router';
const instance = axios.create({
baseURL: '',
timrout: 5000
});
instance.interceptors.request.use(
(config) => {
const store = useUserStore();
if (store.userInfo?.token && config.headers) {
config.headers.Authorization = store.suerInfo.token;
}
if (sessionStorage.getItem('token') && config.headers) {
config.headers.Authorization = sessionStorage.getItem('token');
}
return config;
},
(err) => Promise.reject(err);
);
instance.interceptors.response.use(
(res) => {
if (res.data.code !== 10000) {
showToast(res.data.message || '业务失败!');
return Promise.reject(res.data);
}
return res.data;
},
(err: AxiosError) => {
if (res.response?.status === 401) {
const store = useUserStore();
store.clearUserInfo();
router.push({
path: '/login',
query: {
returnUrl: router.currentRoute.value.fullPath
}
});
}
return Promise.reject(err);
}
);
export default instance;
二、封装工具函数 及 类型设置
2.1 封装工具函数,定义泛型函数
- 工具函数位置一般都是在
src/utils/request.ts 或 src/apis/http.ts;
- 这里以
src/utils/request.ts 为例;
export interafce ResData<T> {
data: number;
data: T;
message: string;
};
type ResData<T> = {
code: number;
data: T;
message: string;
};
export const request = <T>(url: string, method: Method = 'GET', submitData?: object) => {
return interface<any, ResData<T>>({
url,
method,
[method.toUpperCase() === 'GET' ? 'params' : 'data']: submitData
});
}
2.1.1 ❗❗ 注意这块有坑
- 如果定义请求工具函数泛型的时候,你使用的是
interface,后续在声明API函数的时候,会报错;

- 解决:
- 将 定义的接口(
interface) 进行 按需导出 即可;
- 如果使用的是类型别名的方式定义泛型,在后续的使用中是不会报错的;
2.2 展示【定义类型 + 封装接口 + 调用接口】
2.2.1 定义类型文件
export interface UserInfo {
username: string;
id: string;
avatar: string;
mobile: string;
account: string;
token: string;
refreshToken: string;
}
export type UserInfo = {
username: string;
id: string;
avatar: string;
mobile: string;
account: string;
token: string;
refreshToken: string;
}
2.2.2 封装接口
import { request } from '@/utils/request'
export const getUserInfoAPI = (data)<T> => request<T>('/app/auth/jwt/getUserInfo', 'POST', data);
2.2.3 调用接口,导入类型文件,传入类型
import type { UserInfo } from '@/types/user';
import { getUserInfoAPI } from '@/apis/user';
const getUserInfo = async() => {
const userInfo = await getUserInfoAPI<UserInfo>({ username: '张三', password: 'Aa123456@@'});
}
