这是我的第一个问题,所以请告诉我如何改进。
我有以下axios提取函数:
export enum RequestMethod {
GET = 'GET',
POST = 'POST',
PUT = 'PUT',
PATCH = 'PATCH',
DELETE = 'DELETE',
}
export const fetchAxiosAPI = async (
url: string,
method: RequestMethod,
data = {},
options = {}
) => {
let result;
try {
result = await axios({
method,
url: `${process.env.REACT_APP_API_URL}/${url}`,
data,
...options,
validateStatus: () => {
return true;
},
}).then(response => response.data);
} catch (err) {
return null;
}
const errorStatus = result.error.status;
if (errorStatus === 401) {
localStorage.removeItem('access_token');
history.push('/login');
}
if (errorStatus === 404) {
history.replace(NOT_FOUND);
}
if (errorStatus === 500) {
history.replace(INTERNAL_SERVER_ERROR);
}
return result;
};
它看起来很难看,用的是等待,然后(我们不应该使用)。我有两个问题:
axios.get(网址)
但是还没有找到像我的代码示例中提供的那样使用通用axios方法传递泛型的方法。
fetchAxiosAPI
函数.发布于 2021-05-05 10:44:08
如果我正确地读取了文档和index.d.ts
文件,axios.request
就应该这样做。从医生那里:
为了方便起见,为所有受支持的请求方法提供了
。
axios.request(config)
..。
导出接口AxiosInstance { (config: AxiosRequestConfig):AxiosPromise;(url: string,config?:AxiosRequestConfig):AxiosPromise;默认值: AxiosRequestConfig;拦截器:{ request: AxiosInterceptorManager;response: AxiosInterceptorManager;};getUri(config?:AxiosRequestConfig):string;request (config: AxiosRequestConfig):诺言;get(url: string,config?:AxiosRequestConfig):答应;get(url: string,config?:AxiosRequestConfig):承诺;options(url: string,config?:AxiosRequestConfig):承诺;post(url: string,data?:any,config?:AxiosRequestConfig):承诺;put(url: string,data?:any,config?:AxiosRequestConfig):承诺;patch(url: string,data?:any,config?:AxiosRequestConfig);导出接口AxiosStatic扩展AxiosInstance {create(config: AxiosRequestConfig):AxiosInstance;Cancel: CancelStatic;CancelToken: CancelTokenStatic;isCancel(value: any):布尔;all(值:(T允诺)[]):Promise;spread(回调:(...args: T[]) => R):(数组: T[]) => R;=>(有效载荷: any):有效载荷是...args;}声明const axios:;
注意,request
只是接受配置对象,就像axios
函数本身一样,但是与axios
不同,它有您在get
、post
等方面使用过的泛型类型参数。
如下所示,请参阅***
注释:
export const fetchAxiosAPI = async <T>(
// ^^^−−−−−−−−−−− *** type parameter
url: string,
method: RequestMethod,
data = {},
options = {}
) => {
let result: T;
try {
// *** Get the response using `axios.request` with the type argument
const response = await axios.request<T>({
method,
url: `${process.env.REACT_APP_API_URL}/${url}`,
data,
...options,
validateStatus: () => {
return true;
},
});
// *** Get the result
result = response.data;
} catch (err) {
return null; // *** This is poor practice; allow the error to propagate
// or throw a new error
}
const errorStatus = result.error.status;
if (errorStatus === 401) {
localStorage.removeItem('access_token');
history.push('/login');
}
if (errorStatus === 404) {
history.replace(NOT_FOUND);
}
if (errorStatus === 500) {
history.replace(INTERNAL_SERVER_ERROR);
}
return result;
};
https://stackoverflow.com/questions/67399545
复制相似问题