首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型标公理

类型标公理
EN

Stack Overflow用户
提问于 2021-05-05 10:29:31
回答 1查看 6.8K关注 0票数 1

这是我的第一个问题,所以请告诉我如何改进。

我有以下axios提取函数:

代码语言:javascript
运行
复制
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;
};

它看起来很难看,用的是等待,然后(我们不应该使用)。我有两个问题:

  1. 如何将类型记录泛型作为一个参数传递到此函数中,该参数将为API调用的响应推断类型记录类型(
  2. )?我发现并举例使用了axiosmethodName,比如:

axios.get(网址)

但是还没有找到像我的代码示例中提供的那样使用通用axios方法传递泛型的方法。

  1. 如何处理错误状态、捕获块并等待/然后使用其中的一个?基本上,如何重写fetchAxiosAPI函数.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-05 10:44:08

如果我正确地读取了文档和index.d.ts文件,axios.request就应该这样做。从医生那里:

为了方便起见,为所有受支持的请求方法提供了

axios.request(config)

..。

index.d.ts

导出接口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不同,它有您在getpost等方面使用过的泛型类型参数。

如下所示,请参阅***注释:

代码语言:javascript
运行
复制
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;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67399545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档