【问题标题】:Extracting the function passed into Promise.catch creates a type error提取传递给 Promise.catch 的函数会产生类型错误
【发布时间】:2020-09-10 17:38:26
【问题描述】:

我是 Typescript 的新手,正在尝试理解类型错误。在我简化的下面的代码中,函数ok 编译得很好,但是当我提取handleError 函数时,它不再进行类型检查。据我所知,代码是相同的,因为我所做的只是提取一个函数,但显然这里有一些我不明白的地方。你能帮我理解为什么会发生这种情况,是否有办法解决它?

这是编译好的代码

  const ok = <T>(): Promise<AxiosResponse<T>> =>
    axios.post<T>('http://example.com', {}, {}).catch(
      (params: AxiosError<T>): Promise<AxiosResponse<T>> => {
        return Promise.reject<AxiosResponse<T>>(params)
      }
    )

这是没有的代码。

  const handleError = <T>(params: AxiosError<T>): Promise<AxiosResponse<T>> => {
    return Promise.reject<AxiosResponse<T>>(params)
  }

  const notOk = <T>(): Promise<AxiosResponse<T>> =>
    axios.post<T>('http://example.com', {}, {}).catch(handleError)

我得到的错误是

Type 'Promise<AxiosResponse<T> | AxiosResponse<{}>>' is not assignable to type 'Promise<AxiosResponse<T>>'.
  Type 'AxiosResponse<T> | AxiosResponse<{}>' is not assignable to type 'AxiosResponse<T>'.
    Type 'AxiosResponse<{}>' is not assignable to type 'AxiosResponse<T>'.
      Type '{}' is not assignable to type 'T'.  TS2322

    46 | const notOk = <T>(): Promise<AxiosResponse<T>> =>
    47 |   axios.post<T>('http://example.com', {}, {}).catch(handleError)
  > 48 |
       | ^

我的猜测是某些类型信息丢失了,需要告知 handleError 是什么 T,但我不知道该怎么做。

这是一个codesandbox,以防它有助于检查。

【问题讨论】:

标签: typescript generics promise axios typescript-generics


【解决方案1】:

发生错误是因为 catch 块不能用泛型代替您的 handleError 函数。要解决此问题,您必须手动完成 (example)

export const notOk = <T>(): Promise<AxiosResponse<T>> =>
  axios.post<T>("http://example.com", {}, {}).catch(error => handleError<T>(error));

另一种解决方案是为handle error (example) 创建默认泛型类型

const handleError = <T = any>(
  params: AxiosError<T>
): Promise<AxiosResponse<T>> => {
  return Promise.reject<AxiosResponse<T>>(params);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多