为何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类型时才会生效。
具体到你的例子:
Promise.reject()的类型是Promise<never>(未指定拒绝原因时,默认类型为never)。- 当你传入
() => 5作为catch的回调时,回调的返回值类型是number,TypeScript会自动将TResult推断为number,覆盖默认的never。 - 此时
catch方法的返回类型变为Promise<never | number>,等价于Promise<number>,完全符合类型定义的要求,因此不会触发报错。
换个场景验证:如果回调返回never类型的值(比如抛出错误的函数),catch会使用默认的TResult = never,返回类型为Promise<never>,同样符合规则。
内容的提问来源于stack exchange,提问作者amigo
相关产品推荐
相关产品推荐

