返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 1922|回复: 0

[其他] Vue3 + TypeScript axios处理拦截器interceptors中requestInterceptor存在config.headers存在未定义的可能...

[复制链接]
发表于 2023-4-10 20:57:02 | 显示全部楼层 |阅读模式

少侠不来段修仙之旅吗~

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
本帖最后由 痘痘安 于 2023-4-10 20:58 编辑

前言

在Vue3 + TypeScript 学习时,学习到用typescript封装axios时,出现了一个问题
那就是如下图所示的config.headers的对象可能未定义

问题所在地方

一开始我非常的不理解为什么会出现这个问题。因为我的代码是写的也没有问题啊。别人的案例代码也是这样写的。然后我就想,会不会是版本问题。

于是开始查看axios的源码

果然如此

这是axios 0.26.1版本的AxiosRequestConfig里面的headers的类型定义

这是0.21.0版本的AxiosRequestConfig里面的headers的类型定义

然后最新版本,1.3.5是与上面不一样的类型

也就是说,先前版本的headers是any类型的,也就是说可以为任意类型。不会有undefined类型。

当然很明显先前版本的设计是不对的,因为config.headers确实有可能是undefined类型。

虽然很对,但是这样就出现问题了呀。

解决方案解决方案一:降低版本

最简单的解决方案:
把axios版本降低到没有对AxiosRequest的类型检测进行更新的版本即可

  1. npm uninstall axios
  2. npm install axios@0.21.1
复制代码

解决方案二:对headers进行判断

  1. interceptors: {

  2.   requestInterceptor: (config) => {

  3.     console.log('单独请求的config')

  4.     if (config && config.headers) { // 多一步判断

  5.       config.headers['token'] = '123'

  6.     }

  7.     return config

  8.   },

  9.   responseInterceptor: (res) => {

  10.     console.log('单独响应的response')

  11.     return res

  12.   }

  13. }
复制代码


解决方案三:进行类型覆盖

用接口类型进行typeScript的类型覆盖

  1. interface YXRequestConfig extends AxiosRequestConfig {

  2.   interceptors?: YXRequestInterceptors

  3.   headers?: any

  4. }

  5. interceptors: {

  6.   requestInterceptor: (config: YXRequestConfig) => {

  7.     const token = ''

  8.     if (token) {

  9.       config.headers.Authorization = `Bearer ${token}`

  10.     }

  11.     console.log('请求成功的拦截')

  12.     return config

  13.   },

  14. }
复制代码



游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表