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
相关产品推荐
相关产品推荐

