TypeScript中never类型作为类型参数时的特殊行为疑问
TypeScript中never作为类型参数的特殊行为解析
你遇到的问题核心在于分布式条件类型的特性,这是TypeScript处理条件类型时的特殊规则,尤其是当类型参数为never时。
关键差异:分布式 vs 非分布式条件类型
Type2是直接进行条件判断:never extends never,这个判断结果为true,所以Type2的最终类型是{ type: "A" },这也是为什么var2能正常赋值。Type1<T>中的条件类型是分布式条件类型:当extends左侧是一个裸类型参数(即没有被数组、元组、对象等包裹的类型参数)时,TypeScript会对传入的联合类型进行"分发"处理。而never本质是一个空的联合类型,当把never传入Type1的类型参数T时,因为没有任何联合成员可以参与分发,整个条件类型的结果就会直接返回never——这意味着Type1<never>的类型是never,而never类型没有任何合法的值,所以你给var1赋值{ type: "A" }会触发报错。
验证代码
type Type1<T> = T extends never ? { type: "A" } : { type: "B", value: T } type Type2 = never extends never ? { type: "A" } : { type: "B", value: never } // 查看类型结果 type CheckType1 = Type1<never>; // 类型为 never type CheckType2 = Type2; // 类型为 { type: "A" }
如何让Type1返回预期类型
如果你想禁用分布式行为,让Type1<never>和Type2结果一致,可以把裸类型参数包裹在元组中,破坏分布式触发条件:
type Type1<T> = [T] extends [never] ? { type: "A" } : { type: "B", value: T } type FixedType1 = Type1<never>; // 类型为 { type: "A" }
内容的提问来源于stack exchange,提问作者kukuruznik
相关产品推荐
相关产品推荐

