TypeScript中为何引入模块需要从@types下?react+ts环境下的axios封装和全局loading

yarn add axios

在合适的位置新建一个ts文件
在引入qs的时候可能会报错未找到此模块,执行

npm i --save-dev @types/qs

解决完报错之后,可能组件中引入的react模块也报错未找到此模块,继续执行

 yarn add  @types/react  

当我们用 npm 等包管理工具安装第三方包的时候,有些包并不是 TypeScript 编写的,自然也不会导出 TypeScript 声明文件。
这种情况下,如果我们在 TypeScript 项目中引入了这种包,则会编译报错(没有设置 allowJS)。比如,当我们通过npm install jquery --save 安装 jquery 包并引用的时候,TypeScript 会报错:TypeScript 没有找到 jquery 这个包的定义,你可以通过npm install @types/jquery安装相关声明,或者自己定义一份.d.ts 文件,并将 jquery 声明为 module。

全世界不是 TypeScript 编写的包多了去了。即使你的包是 TypeScript 编写的,如果你没有导出声明文件,也是没用的。(TypeScript 默认不会导出声明文件,只会编译输出 JavaScript 文件)。因此 TypeScript 必须对这种情况提供解决方案,而上面的两种方案(安装 @types 和 自己 declare module)就是 TypeScript 官方提出的, 你可以选择适合你的方案。我的推荐是尽量使用 @types 下的声明,实在没有,再使用第二种方法。

typescript官网

import axios, { AxiosError } from 'axios'
import qs from 'qs' 
import { get } from 'lodash' // yarn add  @types/lodash
import HTTP_STATUS_CODE from './httpStatusCode' // 一个状态码管理的ts文件
import Auth from './Auth' // 一个权限管理的ts文件

const DEFAULT_TIMEOUT = 6000
let HOST = ''

try {
  if (process.env.PRO_HOST) { // 上一篇文章中提到的定义全局变量的webpack配置
    HOST = process.env.PRO_HOST
  }
} catch (e) {
  console.error(e)
}

const instance = axios.create({
  timeout: DEFAULT_TIMEOUT,
  baseURL: HOST + '/api/admin',
  paramsSerializer(params) { // 是一个负责 `params` 序列化的函数
    return qs.stringify(params, { arrayFormat: 'repeat', skipNulls: true })
  },
})

function handleError(error: AxiosError) {
  // do something,下面接口错误时返回登陆页面
  
  const url = get(error, 'config.url')
  const whiteList = ['/login', '/auth']
  const whiteListReg = new RegExp(`(${whiteList.join('|')})`, 'g')

  if (!whiteListReg.test(url) && error.response && error.response.status === HTTP_STATUS_CODE.UNAUTHORIZED) {
    Auth.clearToken()
    window.location.reload()
  }

  return Promise.reject(error)
}

// 添加请求拦截器
instance.interceptors.request.use( (config) => {
  // 在发送请求之前做些什么
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use( (response) => {
  // 对响应数据做点什么
  return response;
}, handleError);

export default instance
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值