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

为何TypeScript不对Promise.reject().catch(() => 5)报错?

为什么TypeScript不对Promise.reject().catch(() => 5)报错?

核心原因是TypeScript会自动推断catch方法的泛型参数TResult,而非固定使用默认的never。

先看Promise接口中catch的定义:

interface Promise<T> {
    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
}

这里的TResult = never只是泛型默认值,仅当无法从上下文推断出TResult类型时才会生效。

具体到你的例子:

  1. Promise.reject()的类型是Promise<never>(未指定拒绝原因时,默认类型为never)。
  2. 当你传入() => 5作为catch的回调时,回调的返回值类型是number,TypeScript会自动将TResult推断为number,覆盖默认的never。
  3. 此时catch方法的返回类型变为Promise<never | number>,等价于Promise<number>,完全符合类型定义的要求,因此不会触发报错。

换个场景验证:如果回调返回never类型的值(比如抛出错误的函数),catch会使用默认的TResult = never,返回类型为Promise<never>,同样符合规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:30:02