axios的最新封装,办理范例AxiosRequestConfig不能赋值给InternalAxiosReqe ...

火影  金牌会员 | 2024-6-15 02:27:00 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 647|帖子 647|积分 1941

在最新的axios封装中,大概会出现,以下两个问题:
① 范例CreateAxiosDefaults不能赋值给AxiosRequestConfig

   范例"CreateAxiosDefaults<any>'的参数不能赋给范例“AxiosRequestConfig<any>”的参数。
属性headers'的范例不兼容。
不能将范例"AxiosHeaders|Partial<HeadersDefaults>|Partial<RawAxiosHeaders&{Accept:
AxiosHeaderValue;"Content-Length":AxiosHeaderValue;"User-Agent":AxiosHeaderValue;"Content-
Encoding'":AxiosHeaderValue;Authorization:AxiosHeaderValue;}&{..;}>|undefined'分配给范例
"AxiosHeaders (Partial<RawAxiosHeaders Accept:AxiosHeaderValue;"Content-Length":
AxiosHeaderValue;"User-Agent":AxiosHeaderValue;"Content-Encoding":AxiosHeaderValue;
Authorization:AxiosHeaderValue;}{...;}>artial<...>)undefined".
不能将范例Partial<HeadersDefaults>分配给范例“AxiosHeaders|(Partial<RawAxiosHeaders&{
Accept:AxiosHeaderValue;"Content-Length":AxiosHeaderValue;"User-Agent":AxiosHeaderValue;
"Content-Encoding":AxiosHeaderValue;Authorization:AxiosHeaderValue;}{...;}>
Partial<...>)undefined”。
不能将范例Partial<HeadersDefaults>”分配给范例Partial<RawAxiosHeaders&{Accept:
  通过查察源码我们可以发现 ,原来的范例AxiosRequestConfig已变成了CreateAxiosDefaults。但CreateAxiosDefaults又继承了AxiosRequestConfig。

 ② 范例AxiosRequestConfig不能赋值给InternalAxiosRequestConfig

   范例“(config:AxiosRequestConfig<any>)=>AxiosRequestConfig<any>'的参数不能赋给范例“(value:
InternalAxiosRequestConfig<any>)=>InternalAxiosRequestConfig<any>
Promise<InternalAxiosRequestConfig<any>>'的参数。
不能将范例"AxiosRequestConfig<any>'分配给范例"InternalAxiosRequestConfig<any>
Promise<InternalAxiosRequestConfig<any>>".
不能将范例“AxiosRequestConfig<any>”分配给范例"InternalAxiosRequestConfig<any>”。
属性headers的范例不兼容。
不能将范例"AxiosHeaders|(Partial<RawAxiosHeaders&{Accept:AxiosHeaderValue;"Content-
Length":AxiosHeaderValue;"User-Agent":AxiosHeaderValue;"Content-Encoding":AxiosHeaderValue;
Authorization:AxiosHeaderValue;}&{...;}>&artial<...>)|undefined分配给范例
"AxiosRequestHeaders”。
不能将范例undefined'分配给范例“AxiosRequestHeaders”。
不能将范例undefined'分配给范例"artial<RawAxiosHeaders&{Accept:AxiosHeaderValue;
   同理查察源码,可以发现request的最新范例为InternalAxiosRequestConfig,InternalAxiosRequestConfig又继承于AxiosRequestConfig。

以上两种继承,父类的作用范围是小于子类的
办理方法:

原先axios.create中CreateAxiosDefaults范例的改变影响不大,继承使用它的父类AxiosRequestConfig。
改变的地方:在使用拦截器时,使用InternalAxiosRequestConfig而不使用AxiosRequestConfig
完整代码如下:

  1. import axios from 'axios'
  2. import type {
  3.   AxiosInstance,
  4.   AxiosRequestConfig,
  5.   InternalAxiosRequestConfig,
  6.   AxiosResponse
  7. } from 'axios'
  8. interface HYRequestInterceptors {
  9.   requestInterceptor?: (
  10.     config: InternalAxiosRequestConfig
  11.   ) => InternalAxiosRequestConfig
  12.   requestInterceptorCatch?: (error: any) => any
  13.   responseInterceptor?: (res: AxiosResponse) => AxiosResponse
  14.   responseInterceptorCatch?: (error: any) => any
  15. }
  16. interface HYRequestConfig extends AxiosRequestConfig {
  17.   interceptors?: HYRequestInterceptors
  18. }
  19. class HYRequest {
  20.   instance: AxiosInstance
  21.   interceptors?: HYRequestInterceptors
  22.   constructor(config: HYRequestConfig) {
  23.     this.instance = axios.create(config)
  24.     this.interceptors = config.interceptors
  25.     this.instance.interceptors.request.use(
  26.       this.interceptors?.requestInterceptor,
  27.       this.interceptors?.requestInterceptorCatch
  28.     )
  29.     this.instance.interceptors.response.use(
  30.       this.interceptors?.responseInterceptor,
  31.       this.interceptors?.responseInterceptorCatch
  32.     )
  33.   }
  34.   request(config: AxiosRequestConfig) {
  35.     this.instance.request(config).then((res) => {
  36.       console.log(res)
  37.     })
  38.   }
  39. }
  40. export default HYRequest
复制代码
 进行模块化处理后:


request/type.ts
  1. import {
  2.   InternalAxiosRequestConfig,
  3.   AxiosResponse,
  4.   AxiosRequestConfig
  5. } from 'axios'
  6. export interface HYRequestInterceptors {
  7.   requestInterceptor?: (
  8.     config: InternalAxiosRequestConfig
  9.   ) => InternalAxiosRequestConfig
  10.   requestInterceptorCatch?: (error: any) => any
  11.   responseInterceptor?: (res: AxiosResponse) => AxiosResponse
  12.   responseInterceptorCatch?: (error: any) => any
  13. }
  14. export interface HYRequestConfig extends AxiosRequestConfig {
  15.   interceptors?: HYRequestInterceptors
  16. }
复制代码
 request/index.ts
  1. import axios from 'axios'
  2. import type { AxiosInstance, AxiosRequestConfig } from 'axios'
  3. import type { HYRequestInterceptors, HYRequestConfig } from './type'
  4. class HYRequest {
  5.   instance: AxiosInstance
  6.   interceptors?: HYRequestInterceptors
  7.   constructor(config: HYRequestConfig) {
  8.     this.instance = axios.create(config)
  9.     this.interceptors = config.interceptors
  10.     this.instance.interceptors.request.use(
  11.       this.interceptors?.requestInterceptor,
  12.       this.interceptors?.requestInterceptorCatch
  13.     )
  14.     this.instance.interceptors.response.use(
  15.       this.interceptors?.responseInterceptor,
  16.       this.interceptors?.responseInterceptorCatch
  17.     )
  18.   }
  19.   request(config: AxiosRequestConfig) {
  20.     this.instance.request(config).then((res) => {
  21.       console.log(res)
  22.     })
  23.   }
  24. }
  25. export default HYRequest
复制代码
使用:
  index.ts
  1. // service统一出口
  2. import HYRequest from './request'
  3. import { BASE_URL, TIME_OUT } from './request/config'
  4. const hyRequest = new HYRequest({
  5.   baseURL: BASE_URL,
  6.   timeout: TIME_OUT,
  7.   interceptors: {
  8.     requestInterceptor: (config) => {
  9.       console.log('请求成功的拦截')
  10.       return config
  11.     },
  12.     requestInterceptorCatch: (err) => {
  13.       console.log('请求失败的拦截')
  14.       return err
  15.     },
  16.     responseInterceptor: (res) => {
  17.       console.log('请求成功的拦截')
  18.       return res
  19.     },
  20.     responseInterceptorCatch: (err) => {
  21.       console.log('响应成功的拦截')
  22.       return err
  23.     }
  24.   }
  25. })
  26. export default hyRequest
复制代码
拦截器的种写法可以参考我其他博客,这里先不写了


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表