reactjs Axios和Typescript承诺拒绝错误的类型未知

cnh2zyt3  于 2023-02-18  发布在  React
关注(0)|答案(2)|浏览(156)

我目前面临的问题是,我无法使用承诺拒绝返回的错误,因为它不能用Typescript键入。例如,当注册请求失败,因为用户名已经被使用,我返回400messageusername already taken。但我无法访问错误消息,因为try catcherror对象不能键入。
Axios有什么办法可以处理这种情况,并可以给予我使用自定义类型访问错误对象吗?
或者我应该在数据下创建一个error对象,然后在服务器有200时将其返回为null,或者返回一个error对象?
示例:

export interface ErrorRes {
  statusCode: number;
  error: string;
  message: string;
}

export interface ISignupRes {
  token: string;
  user: IUser;
  message: string;
}
const handleSignUp = async () => {
  setLoading(true)
  try {
    const { data, status }: { data: ISignupRes; status: number } =
      await coreApi.post('/auth/signup', {
        email,
        username,
        firstname,
        lastname,
        password,
      })
    if (status === 200) {
      Storage.save(true, 'token', data.token)
      addNotification({
        type: 'success',
        message: data.message,
      })
    } else {
      // this never get's called because if the response returns an error it get's catched
      addNotification({
        type: 'error',
        message: data.message,
      })
    }
    setLoading(false)
  } catch (error) {
    // the error is of type `unkown` to I can't access `error.message`
    setLoading(false)
    addNotification({
      type: 'error',
      message: error.message,
    })
  }
}
qaxu7uf2

qaxu7uf21#

Typescript没有办法验证axios错误是否是代码唯一可能抛出的错误,因此typescript catch块中的错误总是unknownany,显然编译器设置更倾向于unknown
要把错误当作其他东西来处理,你要么需要放一些代码来检查抛出的是什么类型的东西,要么需要使用类型Assert来坚持你知道类型是什么,幸运的是,axios库包含了一个helper函数,可以为你做检查,它有合适的类型来缩小错误对象的范围:

} catch (error) {
  if (axios.isAxiosError(error) {
    // inside this block, typescript knows that error's type is AxiosError<any>
    setLoading(false)
    addNotification({
      type: 'error',
      message: error.message,
    })
  } else {
    // In this block, error is still of type `unknown`
  }
}
y4ekin9u

y4ekin9u2#

下面是一个方法,我发现它有助于 * 键入 * 用户btraut在此处发现的Axios错误:
添加以下内容:

export function isAxiosError<ResponseType>(error: unknown): error is AxiosError<ResponseType> {
  return axios.isAxiosError(error);
}

然后使用以下代码,将 MyExpectedResponseType 替换为您希望错误对象成为的类型。

type MyExpectedResponseType = {
  thisIsANumber: number;
};

try {
  // Make the axios fetch.
} catch (error: unknown) {
  if (isAxiosError<MyExpectedResponseType>(error)) {
    // "thisIsANumber" is properly typed here:
    console.log(error.response?.data.thisIsANumber);
  }
}

相关问题