You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为回调函数添加正确类型?修复ESLint类型赋值错误

问题解决与回调类型规范

错误原因

fetch的catch方法捕获的错误参数类型是unknown(TypeScript 4.4+)或any,而你定义的errorCallback要求参数是object类型,直接传递会导致类型不兼容,触发ESLint的类型不安全提示。

解决方案

方案1:修正errorCallback的参数类型(推荐)

根据fetch错误的实际情况,把errorCallback的参数类型改为Error或unknown:

// 推荐用Error类型,因为fetch抛出的通常是Error实例
export const get = (
  route: string,
  callback: (response: object) => void,
  errorCallback: (error: Error) => void, // 改为Error类型
) => {
  fetch(`${host}/${route}`)
    .then(response => response.json())
    .then(callback)
    .catch(error =>
      errorCallback ? errorCallback(error as Error) : console.error(error), // 若类型仍有疑问,添加类型断言
    )
}

如果需要兼容更广泛的错误类型,也可以用unknown,然后在回调内部做类型收窄:

export const get = (
  route: string,
  callback: (response: object) => void,
  errorCallback: (error: unknown) => void, // 改为unknown类型
) => {
  fetch(`${host}/${route}`)
    .then(response => response.json())
    .then(callback)
    .catch(error =>
      errorCallback ? errorCallback(error) : console.error(error),
    )
}
// 使用时在回调里做类型判断
get(
  "/route",
  (response) => console.log(response),
  (error) => {
    if (error instanceof Error) {
      console.error(error.message);
    } else {
      console.error(String(error));
    }
  }
);

方案2:类型断言(谨慎使用)

如果你能确定捕获的error一定是object类型,可以添加类型断言绕过检查:

.catch(error =>
  errorCallback ? errorCallback(error as object) : console.error(error),
)

但这种方式会跳过TypeScript的类型检查,若实际错误不是object类型,可能引发运行时问题,不推荐随意使用。

回调类型的正确定义方式

为了代码可读性和可维护性,建议用类型别名或接口定义回调类型:

// 定义回调类型别名
type SuccessCallback = (response: object) => void;
type ErrorCallback = (error: Error) => void;

export const get = (
  route: string,
  callback: SuccessCallback,
  errorCallback: ErrorCallback,
) => {
  // ... 函数逻辑
}

如果接口返回的response有固定结构,也可以定义更具体的接口:

interface ApiResponse {
  code: number;
  data: any;
  message: string;
}

type SuccessCallback = (response: ApiResponse) => void;

内容的提问来源于stack exchange,提问作者Simon1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:27:29