ts封裝axios并處理返回值的實(shí)戰(zhàn)案例
本項(xiàng)目的案例是針對(duì)vue3
準(zhǔn)備vue3+ts+axios的項(xiàng)目環(huán)境,這里不演示
src下新建所需文件夾及對(duì)應(yīng)文件,如下圖

- api 保存所有的接口列表及對(duì)應(yīng)的返回?cái)?shù)據(jù)類型
- http 初始化axios,如果超時(shí),設(shè)置攔截器等操作
- axios 二次封裝好的axios,供開發(fā)人員使用
設(shè)置api.ts,假設(shè)如下
/**
* @description: 所有的接口列表
* @param {*} 無參數(shù)
* @return {*} 無返回值
* ```js
* key表示url路徑縮寫
* value表示真實(shí)請(qǐng)求的路徑
* ```
*/
const apiList = {
'getData': '/getData',
'othersData': '/othersData'
}
/**
* @description: 所有的接口列表類型
* @param {*} 無參數(shù)
* @return {*} 無返回值
*/
export type apiKeyType = keyof typeof apiList;
/**
* @description: 接口對(duì)應(yīng)的數(shù)據(jù)返回值類型
* @param {*} 無參數(shù)
* @return {*} 無返回值
*/
export interface apiKeyDataType {
'getData': {
code: number;
data: {
name: string;
age: number;
work: string[]
}
},
'othersData': {
code: number;
data: string[]
}
}
export default apiList;
設(shè)置http.ts
import axios, {Method, AxiosInstance, AxiosRequestConfig, AxiosPromise, AxiosInterceptorManager, AxiosResponse} from 'axios';
import qs from 'qs';
import {apiKeyType, apiKeyDataType} from './api';
type ResultDataType = apiKeyDataType[apiKeyType];
/*
NewAxiosInstance接口得根據(jù)自己情況來定
interceptors屬性是必須要有,因?yàn)楹罄m(xù)要用到攔截器
至于<T = any>(config: AxiosRequestConfig): AxiosPromise<T>這一段代碼,因?yàn)槲液罄m(xù)二次封裝axios時(shí)采用的是此類型,所以我這里
聲明的是這種數(shù)據(jù)類型
*/
interface NewAxiosInstance extends AxiosInstance {
/*
設(shè)置泛型T,默認(rèn)為any,將請(qǐng)求后的結(jié)果返回變成AxiosPromise<T>
*/
<T = any>(config: AxiosRequestConfig): AxiosPromise<T>;
interceptors: {
request: AxiosInterceptorManager<AxiosRequestConfig>;
response: AxiosInterceptorManager<AxiosResponse<ResultDataType>>;
}
}
//基本的初始化設(shè)置
let http: NewAxiosInstance = axios.create({
baseURL: import.meta.env.VITE_BASE_URL as string, //因?yàn)槭褂玫氖莢ite構(gòu)建的項(xiàng)目,所以這里是這么獲取代理名稱的,根據(jù)自己情況修改
timeout: 3 * 1000// 超時(shí)時(shí)間
});
// 請(qǐng)求攔截器
const QS_METHOD: Method[] = ['POST', 'post', 'PUT', 'put'];
const GET_METHOD: Method[] = ['GET', 'get', 'DELETE', 'delete'];
http.interceptors.request.use(response => {
if(response.method && QS_METHOD.includes(response.method)){// 這里只處理post請(qǐng)求,根據(jù)自己情況修改
response.data = qs.stringify(response.data);
}else if(response.method && GET_METHOD.includes(response.method)){//設(shè)置GET的請(qǐng)求參數(shù)
response.params = qs.parse(response.data);
response.data = undefined;
}
return response;
}, error => {
return error;
});
//響應(yīng)攔截器
http.interceptors.response.use(response => {
return Promise.resolve(response);
}, error => {
return error;
});
export default http;
設(shè)置axios.ts
import axios from '@/server/http';
import apiList, {apiKeyType, apiKeyDataType} from './api';
import {AxiosRequestConfig} from 'axios';
/*
限制泛型T必須是接口列表(apiKeyType)中的key
限制obj中的url必須是接口列表中key的某一格
*/
export default <T extends apiKeyType>(obj: AxiosRequestConfig & {url: T}) => {
/*
限制最終的返回?cái)?shù)據(jù)類型
*/
return new Promise<apiKeyDataType[T]>((resolve, reject) => {
/*
傳遞泛型給http中的攔截器
*/
axios<apiKeyDataType[T]>({
url: apiList[obj.url],
data: obj.data || {},
method: obj.method || 'GET',
responseType: obj.responseType || 'json'
}).then(res => {
resolve(res.data);
}).catch(error => {
reject(error);
})
})
}
最終效果
在對(duì)應(yīng)文件中引入server下的axios文件輸入選擇url時(shí),將會(huì)有全部接口列表提示,如下圖

選到getData時(shí),可以看到返回值是對(duì)應(yīng)的數(shù)據(jù)類型,如下

選到othersData時(shí),可以看到返回如下

結(jié)束
到此這篇關(guān)于ts封裝axios并處理返回值的文章就介紹到這了,更多相關(guān)ts封裝axios處理返回值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ie8下修改input的type屬性報(bào)錯(cuò)的解決方法
當(dāng)用戶勾選顯示明文復(fù)選框時(shí),要以明文顯示用戶輸入的密碼,去掉勾選時(shí)要變回密文,問題是ie8中是不允許修改input的type屬性2014-09-09
Uniapp實(shí)現(xiàn)地圖獲取定位功能(推薦)
本文詳細(xì)介紹了如何在Uniapp項(xiàng)目中集成地圖功能,實(shí)現(xiàn)定位獲取,并解決微信小程序、APP、H5三端的兼容性問題,涵蓋了環(huán)境準(zhǔn)備、配置地圖基礎(chǔ)功能、獲取用戶定位、多平臺(tái)適配要點(diǎn)以及常見問題及解決方案,感興趣的朋友一起看看吧2025-03-03
js代碼實(shí)現(xiàn)點(diǎn)擊按鈕出現(xiàn)60秒倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了js代碼實(shí)現(xiàn)點(diǎn)擊按鈕出現(xiàn)60秒倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12
js 正則驗(yàn)證密碼強(qiáng)度(包含數(shù)字+特殊字符+英文字母大小寫)
密碼驗(yàn)證是常見的網(wǎng)站注冊(cè)方法,本文主要介紹了js 正則驗(yàn)證密碼強(qiáng)度(包含數(shù)字+特殊字符+英文字母大小寫),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
javascript 密碼強(qiáng)弱度檢測(cè)萬能插件
網(wǎng)上用的比較多的一種用來檢測(cè)用戶輸入密碼的強(qiáng)度檢測(cè),其實(shí)就是把一些常用的拼音,英文單詞, 純數(shù)字,純字母等。2009-02-02
功能強(qiáng)大的Bootstrap使用手冊(cè)(一)
這篇文章主要為大家詳細(xì)介紹了功能強(qiáng)大的Bootstrap使用手冊(cè),分享了Bootstrap使用步驟和常用用法,感興趣的小伙伴們可以參考一下2016-08-08
10行原生JS實(shí)現(xiàn)文字無縫滾動(dòng)(超簡(jiǎn)單)
下面小編就為大家分享一篇10行原生JS實(shí)現(xiàn)文字無縫滾動(dòng)的效果,特別簡(jiǎn)單,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2018-01-01
javascript動(dòng)態(tài)加載實(shí)現(xiàn)方法一
這兩天,沒什么太多的事情,好吧,我承認(rèn),是我這兩天不想做公司的項(xiàng)目,因?yàn)槲彝话l(fā)奇想,其實(shí)也不算突發(fā)奇想,算是對(duì)以前的想法的實(shí)現(xiàn),就是把JS當(dāng)做Java來寫2012-08-08

