ts中的泛型与axios的一次相遇,这不工作效率和代码逼格一下子就上来了

简介: ts中的泛型与axios的一次相遇,这不工作效率和代码逼格一下子就上来了

前言

相信大家在做前端开发的时候都使用过axios这款优秀的网络请求库,可以说几乎每个前后分离的项目都应该离不开他。

众所周知,在使用 javascript 开发的时候,由于语言本身的问题,对数据类型支持不是很友好,尤其是在对象字段很多的时候很容易写错,从而造成一些很难排查的bug。

好在,现在有 typescript 语言的出现弥补了 javascript的这一缺陷。然后配合着IDE很多类型的问题都会被避免。

但是typescript相对于 javascript 上手不是很容易,尤其是前期初学者,会被各种类型检查和红线而折磨甚至最后不得不回退到javascript上来。的确,在刚开始学习的时候肯定会有这样或者那样的问题,不过希望大家坚持一下只有克服了各种问题能力才能成长。

本章内容我们会介绍 typescript 中的泛型功能如何和在axios中应用。


ts中的泛型简单介绍

因为本节不是介绍泛型的,所以关于更多泛型介绍,这里就不多说了,只是简单介绍一下,更多的知识大家可以去 typscript 官网查一下文档。

什么是泛型呢?泛型简单来说就是类型变量,在ts中存在类型,如number、string、boolean等。泛型就是使用一个类型变量来表示一种类型,类型值通常是在使用的时候才会设置。泛型的使用场景非常多,可以在函数、类、interface接口中使用

为什么使用泛型?TypeScript 中不建议使用 any 类型,不能保证类型安全,调试时缺乏完整的信息。
TypeScript可以使用泛型来创建可重用的组件。支持当前数据类型,同时也能支持未来的数据类型。扩展灵活,可以在编译时发现类型错误,从而保证了类型安全。


axios与ts泛型

在开始下面的内容的时候,先说以下几点:

1、以下axios与ts泛型的结合使用方式只是个人在VueAdminWork框架中的使用方式可能不具有广泛的代表性。不喜勿喷

2、在开始以下知识的时候,我们假定您已经具备 typescript 和 axios的相关知识

下面正式开始,我主要是以在 VueAdminWork框架的封装使用为例向大家介绍。

1.定义一个数据类型

我们以下面的数据类型为例:角色数据类型,这个比较简单好理解。

interface RoleModeType {
    roleName: string
    roleCode: string
    description: string
 }

2.再看一下封装的axios操作api

export interface HttpOption {
  url: string
  data?: any
  method?: string
  headers?: any
  beforeRequest?: () => void
  afterRequest?: () => void
}
// 定义返回数据类型的泛型 T,默认值是 any
export interface Response<T = any> {
  totalSize: number | 0
  code: number
  msg: string
  data: T
}
// 定义返回数据类型的泛型 T,默认值是 any
function http<T = any>({ url, data, method, headers, beforeRequest, afterRequest }: HttpOption) {
  const successHandler = (res: AxiosResponse<Response<T>>) => {
    if (res.data.code === 200) {
      return res.data
    }
    throw new Error(res.data.msg || '请求失败,未知异常')
  }
  const failHandler = (error: Response<Error>) => {
    afterRequest && afterRequest()
    throw new Error(error.msg || '请求失败,未知异常')
  }
  beforeRequest && beforeRequest()
  method = method || 'GET'
  const params = Object.assign(typeof data === 'function' ? data() : data || {}, {})
  return method === 'GET'
    ? request.get(url, { params }).then(successHandler, failHandler)
    : request.post(url, params, { headers: headers }).then(successHandler, failHandler)
}
// 定义返回数据类型的泛型 T,默认值是 any
export function get<T = any>({
  url,
  data,
  method = 'GET',
  beforeRequest,
  afterRequest,
}: HttpOption): Promise<Response<T>> {
  return http<T>({
    url,
    method,
    data,
    beforeRequest,
    afterRequest,
  })
}
// 定义返回数据类型的泛型 T,默认值是 any
export function post<T = any>({
  url,
  data,
  method = 'POST',
  headers,
  beforeRequest,
  afterRequest,
}: HttpOption): Promise<Response<T>> {
  return http<T>({
    url,
    method,
    data,
    headers,
    beforeRequest,
    afterRequest,
  })
}

以上代码是我个人封装的在VueAdminWork框架使用的情况,大家可以根据自己的理解进行封装。另外,这里只是封装了 `get` 和 `post` 两种请求方法,更多的请求方法可以自己再次封装。

3. 在 .vue 文件中使用

先来看一下提示功能,当然不只有提示功能这么简单,更重要的是数据安全和减少错误概率

4edc953e2c684bbe819ffa954c899c08.png

const dataList = ref<Array<RoleModeType>>()
function doRefresh() {
  // 在使用的时候,要指定上面我已经定义好的数据类型。
  post<Array<RoleModeType>>({
    url: getRoleList,
    data: {},
  })
    .then((res) => {
      // table.handleSuccess(res)
      dataList.value = res.data
    })
    .catch(console.log)
}

4edc953e2c684bbe819ffa954c899c08.png

可以看到 res.data 就已经是我们指定好了的 `RolaModeType[]` 类型

再来看一下如果数据类型指定不一致的情况:

interface RoleModeType1 {
    roleName1: string
    roleCode1: string
    description1: string
  }
  const dataList = ref<Array<RoleModeType1>>()
      function doRefresh() {
        post<Array<RoleModeType>>({
          url: getRoleList,
          data: {},
        })
          .then((res) => {
            // 这里会报错
            dataList.value = res.data
          })
          .catch(console.log)
      }

错误信息如下4edc953e2c684bbe819ffa954c899c08.png


写在最后

总的来说 typescript 中的 泛型还比较简单的,大家多用几次就可以熟练掌握,但是如果想要用好 ts ,还需要大家的不断努力。

最后我们总结一下在axios中使用泛型的几步:

1. 定义好一个数据类型

2.封装好axios的具体的操作。当然也可以不封装使用,axios已经为我们提供好了接口,可以很容易使用。

3. 在具体的 vue 组件或者页面中使用,传入具体的泛型类型

4. 最后可以通过IDE进行测试一下泛型有没有使用成功,看一下有没有提示就可以了

4edc953e2c684bbe819ffa954c899c08.png

相关文章
|
17天前
【Axios】配置默认值及拦截器代码逐行详解
【Axios】配置默认值及拦截器代码逐行详解
44 0
|
6月前
|
数据处理
Axios 默认配置 简化URL 简化代码 多台服务器接口配置
Axios 默认配置 简化URL 简化代码 多台服务器接口配置
|
10月前
|
前端开发
【React】React+TS 前端工程化 Axios二次封装
【React】React+TS 前端工程化 Axios二次封装
352 0
|
12月前
|
JSON 前端开发 JavaScript
React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)
React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)
118 0
|
前端开发 JavaScript API
开箱即用的axios封装:Vue3+TS(建议收藏)
Axios多用于处理前端项目的Ajax请求,这里要注意区分Axios和Ajax:Ajax是一种技术统称,Axios是第三方库。在使用的时候,我们可以直接使用Axios来发起请求,也可以封装后采用统一的接口发送请求。在前端项目中,应该大多数人都会选择封装一下Axios,不仅可以节省代码,看起来更简洁;而且可以统一管理请求和响应。本文就以Vue3+Typescript,封装一个”开箱即用“的Axios。
7175 4
开箱即用的axios封装:Vue3+TS(建议收藏)
|
前端开发 API
在项目中用ts封装axios,一次封装整个团队受益😁
这篇文章封装的axios已经满足如下功能: 无处不在的代码提示; 灵活的拦截器; 可以创建多个实例,灵活根据项目进行调整; 每个实例,或者说每个接口都可以灵活配置请求头、超时时间等。
415 0
|
JavaScript API
vue3+ts二次封装axios
vue3+ts二次封装axios
227 0
|
自然语言处理 JavaScript 前端开发
vue3、ts如何封装 axios,使用mock.js
vue3、ts如何封装 axios,使用mock.js
vue3、ts如何封装 axios,使用mock.js
|
JavaScript 前端开发 编译器
还不会用 TS 封装 Axios?我教你啊
Axios 的二次封装是一项基础工作,主要目的就是将一些常用的功能进行封装,简化后续网络请求的发送。JS 版本的封装大家都已经非常熟悉了,可以信手拈来。但是使用 TypeScript 对 Axios 进行封装,稍微就复杂了些。主要是由于 TS 引入了类型系统,带来了一些类型的束缚。对于 TS 不太熟悉的小伙伴就容易绕晕。本文将从泛型入手,然后了解 Axios 中的部分类型,延续 JS 版本的极简风,教你封装出一个可用的清爽版 Axios。
3528 0
在项目中使用TS封装 axios,一次封装永久使用
在项目中使用TS封装 axios,一次封装永久使用
486 0
在项目中使用TS封装 axios,一次封装永久使用