乐趣区

VueTypescript中在Vue上挂载axios使用时报错

Vue+Typescript 中在 Vue 上挂载 axios 使用时报错

vue 项目开发过程中,为了方便在各个组件中调用axios,我们通常会在入口文件将 axios 挂载到 vue 原型身上,如下:
main.ts

import Vue from 'vue'
import axios from './utils/http'
Vue.prototype.$axios = axios;

这样的话, 我们在各个组件中进行请求时,就可以直接使用 this.$axios,但是在 ts 中使用this.$axios 进行请求时,会进行报错, 如下所示:

从图中我们可以看出 ts 在 Vue 身上检测不到 $axios。通过
在网上查阅发现:在 ts 中,不识别 vue 下面挂 $axios,不可以挂在原型链上。也就是说我们手动在 Vue 原型身上挂载 $axios,ts 无法识别到。

解决方法 1:手动告诉 ts 忽略这里的类型检测

虽然 ts 无法检测到 Vue 原型身上的 prototype, 但是实际上我们是挂载成功的,也就是说我们是可以正常使用的,唯一需要解决的是 ts 的类型检测问题,因此,我们可以指定 this 为any 类型,这样的话就可以避免报错问题。如下所示:

(this as any).$axios
    .post("/api/users/login", this.ruleForm)
    .then((res: {data:any}) => {}

但是使用 any 意味着失去了类型安全保障,并且你得不到工具的支持。

解决方法 2:使用 vue-axios 这个包来处理这个挂载问题

我们可以通过使用 vue-axios 这个包来处理这个挂载问题。vue-axios 是在 axios 基础上扩展的插件,在 Vue.prototype 原型上扩展了 $http 等属性,可以更加方便的使用 axios。

# 安装
npmi axios
npm i vue-axios -S

# 注册
Vue.use(axios,vue-axios)

# 使用
this.axios()

通过使用 vue-axios 包, 我们可以直接使用 this.axios 进行调用。

从上面我们可以看出 vue-axios 帮助我们实现了在 Vue 原型身上挂载axios,而且能够被 ts 检测到。这样就完美避免了 ts 报错的问题。

说明

使用 ts 进行开发的过程中,会遇到各种各样的报错问题,希望记录下来,避免下次再次踩坑,也希望帮助其他人。

退出移动版