typescript拓展axios的get方法类型声明

需求是要拓展 axios 的 get 方法的类型

首先遇到的第一个坑是 declare 会覆盖原有类型的问题

1
declare module "axios" {}

如果这样直接这样写的话,vscode 会报错,axios 自带的类型会被覆盖。记得之前也有过同样的需求,也是这样做的,搞了半天才发现

1
2
import axios from "axios"; // 要把axios import进来,vscode就没报错了
declare module "axios" {}

然后是 axios 的 get 方法是写在 class Axios 里的

1
2
3
4
5
6
import axios from "axios";
declare module "axios" {
class Axios {
get(): void; // 这样不生效
}
}

我项目是用的 axios.create 方法创建出来的,类型是 AxiosInstance,AxiosInstance 是一个 interface,所以就可以拓展了

1
2
3
4
5
6
import axios from "axios";
declare module "axios" {
interface AxiosInstance {
get(): void; // 写具体的get类型
}
}

axios 默认导出的是 AxiosStatic 类型,所以没有用 axios.create 的话,拓展 AxiosStatic 就行了

1
declare const axios: AxiosStatic;

补充一个 axios 类型的另外一个问题
axios 的 AxiosRequestConfig 里的 params 属性,平时我用 get 方法的时候传 query 一般是用这个属性传,但是 AxiosRequestConfig 里 params 是 any 类型

如果需要声明 params 的类型的话可以这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import axios from "axios";
declare module "axios" {
interface CustomRequestConfig<D> extends AxiosRequestConfig<D> {
params?: D;
}
interface AxiosInstance {
get<
T = any, // 这里是response的body类型
R = AxiosResponse<T>,
D = any // 这里填需要的params类型
>(
url: string,
config?: CustomRequestConfig<D>
): Promise<R>;
}
}