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

TypeScript动态泛型问题:可选errorCallback参数类型不兼容

问题原因与解决方案

报错原因

核心问题在于泛型TErrorCallbackReturn缺少默认值关联,且未与默认回调的返回类型绑定。当你不传入自定义errorCallback时,TypeScript无法自动推断TErrorCallbackReturn的类型,而默认回调的返回类型Promise<ServiceError<TSchema>>和未被约束的泛型参数之间没有明确的兼容关系,导致TS判定两者类型不匹配,抛出赋值错误。

修正后的代码

type ServiceError<TSchema> = {
  schema: TSchema;
  message: string;
};

function handleError<TSchema, TErrorCallbackReturn = Promise<ServiceError<TSchema>>>(
  error: ServiceError<TSchema>,
  errorCallback?: (e: ServiceError<TSchema>) => TErrorCallbackReturn
): TErrorCallbackReturn {
  const defaultCallback = (e: ServiceError<TSchema>): Promise<ServiceError<TSchema>> => {
    console.error("Default error handler:", e);
    return Promise.resolve(e);
  };

  const callback = errorCallback ?? defaultCallback;
  return callback(error) as TErrorCallbackReturn;
}

// 使用示例
// 1. 无自定义回调,返回类型为Promise<ServiceError<{id: number}>>
handleError({ schema: { id: 1 }, message: "Test error" });

// 2. 传入自定义回调,返回类型匹配回调返回值
handleError({ schema: { id: 1 }, message: "Test error" }, (e) => "Error handled");

关键调整说明

  • 给泛型TErrorCallbackReturn设置默认值Promise<ServiceError<TSchema>>,确保不传入自定义回调时,泛型自动对齐默认回调的返回类型。
  • 使用??运算符兜底默认回调,保证逻辑上的 fallback 机制。
  • 末尾的as TErrorCallbackReturn类型断言是安全的:当传入自定义回调时,泛型会被自动推断为回调的返回类型;未传入时,泛型使用默认值,与默认回调返回类型一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:52:10