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

TypeScript泛型参数中如何过滤never类型?

问题原因分析

你的问题核心在于泛型参数为never时,分布式条件类型的特殊行为,以及直接使用keyof T和将其作为泛型参数传递的区别:

1. 为什么带K参数的版本返回never?

当T是{}或object时,keyof T的结果是never,因此K的默认值被设为never。此时你的条件类型属于分布式条件类型——TypeScript会对泛型参数K的每个联合成员单独进行条件判断,再将结果合并。但never是空联合,没有任何成员可以参与分发,因此整个条件类型的结果直接是never,而非匹配第一个分支。

2. 为什么移除K参数后正常?

第二个版本中,你直接使用keyof T extends never,这里的keyof T是一个具体类型(而非泛型参数),不会触发分布式条件类型。TypeScript会直接判断never extends never为true,因此正确返回{ __debug: 1 }。

解决方案

要让带K参数的版本符合预期,需要避免分布式条件类型,可以通过将泛型参数包裹在元组中实现:

type Foobar<T extends object, K extends keyof T = keyof T> = 
  [K] extends [never] 
    ? { __debug: 1 } 
    : K extends string
      ? { __debug: 2 }
      : { __debug: 3 }
;

let test2: Foobar<{}>; // 现在得到{ __debug: 1 }
let test3: Foobar<object>; // 现在得到{ __debug: 1 }

元组[K]会将K作为整体处理,即使K是never,也会直接判断[never] extends [never]为true,从而进入预期分支。

内容的提问来源于stack exchange,提问作者shau-kote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:10:32