基于 TypeScript重构Axios-基础功能(接口拓展)

91 阅读2分钟

接口拓展其实就是利用工厂函数+混合对象实现的一个函数,但是该函数结合了自身及其他目标对象的实例和原型属性

针对接口拓展分成了以下三个步骤:

  1. 定义接口类型
  2. 创建Aios类
  3. 基本模块化编程提炼核心代码
  4. 实现混合对象

1.定义接口类型

  1. 在types/index文件中给定义类型接口Axios(代码描述了axios的公共代码)
  2. 最后定义AxiosInstance混合对象类型,继承Axios对象的属性类型和实例类型

image.png

2.创建Aios类

  1. 在src文件夹下创建文件夹core,存放Axios核心代码
  2. 在文件见core下创建Axios.ts文件
  3. 结合接口类型写Axios类的主体代码(代码中含可复用模块_requestMethodWithoutData,_requestMethodWithData)

image.png

3. 基本模块化编程提炼核心代码

从第2点的代码中发现request方法的功能跟最初定义的axios函数功能基本一致,基于模块化编程思想,单独抽离原axios部分的代码并在core文件夹下创建dispatchRequest方法进行迁移,另外把xhr.ts也迁移到core目录下, 在core目录归一化代码作用

image.png

4. 实现混合对象

这个是axios混合对象实现的核心,也比较简单,就是在这个对象是函数的基础上还要包括Axios类的所有原型属性和实例属性,这里有两个要点

  1. 在helpers目录/util.ts文件下创建辅助函数extend,采用交叉类型+类型断言规范类型
  2. 采用for...in方法,for...in 语句以任意顺序迭代一个对象的除 Symbol 以外的可枚举属性,包括继承的可枚举属性,如Object和Array设置了不可枚举配置则不可遍历,该规则可结合Vue2数据响应式源码(object.defineProperty)理解,好久之前写过,链接:juejin.cn/post/712135… 3.在axios.ts创建工厂函数,调用extend辅助函数实现axios混合对象

image.png

image.png