问答

请教一个typescript封装axios的问题

作者:admin 2021-04-22 我要评论

首先问题是现在有些接口需要loading,或者需要token之类的,需要一些额外的配置传进来判断,以前用js是直接像这样写就好了: export function post(url: string,...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

首先问题是现在有些接口需要loading,或者需要token之类的,需要一些额外的配置传进来判断,以前用js是直接像这样写就好了:

export function post(url: string, params: object, extraConfig?: Config) {
  extraConfig = dealConfig(extraConfig);
  return request({
    url,
    method: 'post',
    data: params,
    extraConfig
  });
}

但是现在ts的话直接写会报错,只能加在了headers里面,这样就会导致请求接口的时候能看到这个,就很奇怪的感觉:

image.png

不能在请求的时候delete extraConfig,因为有些配置在响应的时候也需要用到。小弟刚开始用ts,请求大佬指点一下这一块的封装该怎么写?

完整代码如下:

import axios from 'axios';

const request = axios.create({
  timeout: 50 * 1000,
  headers: {
    'Content-Type': 'application/json'
  }
});

request.interceptors.request.use(
  config => {
    const headers = config.headers;
    const { extraConfig } = headers;
    if (extraConfig) {
      const { needLoading, needToken } = extraConfig;
      if (needLoading) {
        // loading
      }
      if (needToken) {
        // headers.token = xxxx;
      }
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

request.interceptors.response.use(
  response => {
    if (response.config.headers.extraConfig.needHandleError) {
      // 需要处理的错误直接返回原样格式
    }
    // ...
  },
  error => {
    // ...
  }
);

interface Config {
  needLoading?: boolean;
  needToken?: boolean;
  needHandleError?: boolean;
}

function dealConfig(extraConfig?: Config): Config {
  const defaultExtraConfig = {
    needLoading: true,
    needToken: true,
    needHandleError: false
  };
  if (typeof extraConfig === 'undefined') {
    extraConfig = JSON.parse(JSON.stringify(defaultExtraConfig));
  } else {
    Object.keys(defaultExtraConfig).forEach(key => {
      if (!Object.prototype.hasOwnProperty.call(extraConfig, key)) {
        (extraConfig as Config)[key] = defaultExtraConfig[key];
      }
    });
  }
  return extraConfig;
}

export function post(url: string, params: object, extraConfig?: Config) {
  extraConfig = dealConfig(extraConfig);
  return request({
    url,
    method: 'post',
    data: params,
    headers: {
      extraConfig
    }
  });
}

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 求助!Mysql workbench connections出

    求助!Mysql workbench connections出

  • c++ 的dll 转golang可以调用

    c++ 的dll 转golang可以调用

  • c++的 new int{10}  和 new int(10) 有

    c++的 new int{10} 和 new int(10) 有

  • Grafana MySQL为数据源时, 折线图无法

    Grafana MySQL为数据源时, 折线图无法

腾讯云代理商
海外云服务器