如何使用TS對axios的進(jìn)行簡單封裝
1.安裝axios
npm i axios
2.在合適路徑下新建request.ts(名稱可隨意),例如可以在項(xiàng)目的src下創(chuàng)建utils文件夾創(chuàng)建request.ts
3.導(dǎo)入axios并創(chuàng)建axios實(shí)例
//引入axios import axios from 'axios' //使用指定配置創(chuàng)建axios實(shí)例 const instance = axios.create({ // 基礎(chǔ)路徑 baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net/', // 請求超時(shí)時(shí)間 timeout: 5000, // ....其他配置 })
4.封裝請求函數(shù)
① 查看axios的類型聲明文件
② 請求配置對象的類型
從圖中可知AxiosRequestConfig是axios請求配置對象的接口,例如下面的代碼,axios函數(shù)的第一個(gè)參數(shù)就是AxiosRequestConfig接口的實(shí)例。而泛型D則是請求配置對象(axios函數(shù)的第一個(gè)參數(shù))中data的類型,默認(rèn)類型為any,因?yàn)锳xiosRequestConfig接口內(nèi)容太多就不列出來了。
axios({ url: 'http://', method: 'post', data: {} // .... })
③ 響應(yīng)對象的類型
axios發(fā)送數(shù)據(jù)請求后會返回的promise實(shí)例,AxiosResponse就是這個(gè)promise實(shí)例成功后回調(diào)函數(shù)的第一個(gè)參數(shù)的類型,例如下面的代碼,代碼中的response的類型就是AxiosResponse。
axios({ url: 'http://', method: 'post', data: {} }).then((response) => { console.log(response.data) })
從下圖可知,AxiosResponse接口第一個(gè)泛型參數(shù)T,泛型T就是AxiosResponse接口中data的數(shù)據(jù)類型,默認(rèn)類型為any,也就是上圖response.data的類型。第二個(gè)泛型參數(shù)和請求配置對象一樣,是AxiosRequestConfig接口中data的類型,默認(rèn)類型為any。
④ axios.request函數(shù)
從axios的聲明文件中可以看出直接使用axios()發(fā)送網(wǎng)絡(luò)請求是不能指定泛型參數(shù)的,而axios.request()對泛型的支持非常友好,請看下圖
request函數(shù)的第一個(gè)泛型T指定了第二個(gè)泛型AxiosResponse接口中data的類型。第二個(gè)泛型R默認(rèn)為AxiosResponse,指定了request函數(shù)返回的promise實(shí)例成功的回調(diào)函數(shù)的第一個(gè)參數(shù)的類型。第三個(gè)泛型D指定了請求配置對象中data的數(shù)據(jù)類型。(看不懂的話,請?jiān)俳Y(jié)合第②③點(diǎn)再看一次)
⑤ 開始封裝
// 后臺給我們的數(shù)據(jù)類型如下 // 泛型T指定了Response類型中result的類型,默認(rèn)為any type Response<T = any> = { // 描述 msg: string // 返回的數(shù)據(jù) result: T } // AxiosRequestConfig從axios中導(dǎo)出的,將config聲明為AxiosRequestConfig,這樣我們調(diào)用函數(shù)時(shí)就可以獲得TS帶來的類型提示 // 泛型T用來指定Reponse類型中result的類型 export default <T> (config: AxiosRequestConfig) => { // 指定promise實(shí)例成功之后的回調(diào)函數(shù)的第一個(gè)參數(shù)的類型為Response<T> return new Promise<Response<T>>((resolve, reject) => { // instance是我們在上面創(chuàng)建的axios的實(shí)例 // 我們指定instance.request函數(shù)的第一個(gè)泛型為Response,并把Response的泛型指定為函數(shù)的泛型T // 第二個(gè)泛型AxiosResponse的data類型就被自動指定為Response<T> // AxiosResponse從axios中導(dǎo)出的,也可以不指定,TS會自動類型推斷 instance.request<Response<T>>(config).then((response: AxiosResponse<Response<T>>) => { // response類型就是AxiosResponse<Response<T>>,而data類型就是我們指定的Response<T> // 請求成功后就我們的數(shù)據(jù)從response取出并使返回的promise實(shí)例的狀態(tài)變?yōu)槌晒Φ? resolve(response.data) }).catch((error :any) => { // 請求失敗的處理 reject(error) }) }) }
⑥ 使用
import request from "@/utils/request"; // 商品分類 export interface Category { id: string; name: string; picture: string; children: Category[]; goods: CategoryGoods[]; } // 商品分類下的商品 export interface CategoryGoods { id: string; name: string; desc: string; price: string; picture: string; } /** * 獲取首頁商品分類 * @returns 首頁商品分類數(shù)組 */ export const reqGetCategory = () => { // 指定我們封裝的request函數(shù)的第一個(gè)泛型的類型為Category[],也就是指定 Response<T> 中T的類型 return request<Category[]>({ url: '/home/category/head', method: 'get' }) }
這樣我就可以得到類型提示了
下圖resonse的類型是Response
下圖response.result的類型是Category[]
下圖是response.result數(shù)組中元素的類型是Category
從下圖我們可以看出response的類型
還可以在攔截器里添加更多功能,這里就不再贅述了。如有錯(cuò)誤,請多包涵。
總結(jié)
到此這篇關(guān)于如何使用TS對axios的進(jìn)行簡單封裝的文章就介紹到這了,更多相關(guān)TS對axios簡單封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于bootstrap寫的一點(diǎn)localStorage本地儲存
這篇文章主要介紹了基于bootstrap寫的一點(diǎn)localStorage本地儲存,需要的朋友可以參考下2017-11-11javascript 緩沖運(yùn)動框架的實(shí)現(xiàn)
這篇文章主要介紹了javascript 緩沖運(yùn)動框架的實(shí)現(xiàn)的相關(guān)資料,希望通過本能幫助到大家,實(shí)現(xiàn)這樣類似的功能,需要的朋友可以參考下2017-09-09webpack學(xué)習(xí)教程之前端性能優(yōu)化總結(jié)
webpack是近期最火的一款模塊加載器兼打包工具,它能把各種資源,例如JS(含JSX)、coffee、樣式(含less/sass)、圖片等都作為模塊來使用和處理。這篇文章主要給大家總結(jié)介紹了關(guān)于webpack學(xué)習(xí)教程之前端性能優(yōu)化的相關(guān)資料,需要的朋友可以參考下。2017-12-12javascript 瀏覽器判斷 綁定事件 arguments 轉(zhuǎn)換數(shù)組 數(shù)組遍歷
javascript 瀏覽器 判斷 綁定事件 arguments 轉(zhuǎn)換數(shù)組 數(shù)組遍歷等函數(shù)2009-07-07JavaScript接口的實(shí)現(xiàn)三種方式(推薦)
這篇文章主要介紹了JavaScript接口的實(shí)現(xiàn)三種方式,有注釋法,檢查屬性法和鴨式辨行法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06javascript 語法學(xué)習(xí)練習(xí)
javascript 截取字符串排序2008-12-12分享一道筆試題[有n個(gè)直線最多可以把一個(gè)平面分成多少個(gè)部分]
今天地鐵上和一個(gè)同事閑聊,給我說的一道題,回來想了想,寫出來的,說來慚愧,我用的是行測方面數(shù)字推理里面的知識歸納出來的,當(dāng)然這個(gè)可以用遞歸寫出來,說說我的代碼,以及遞歸的思路2012-10-10