如何在TypeScript中避免联合类型?条件类型尝试失败求解答
解决TypeScript条件类型处理联合类型的问题
这是因为TypeScript里的条件类型对联合类型会触发分布式条件类型特性哦!
当你给NoUnion传入联合类型'a'|'b'时,TypeScript会自动把联合拆成单个成员,分别代入条件类型计算,最后再把结果合并成新的联合:
- 先代入
'a',得到'a' - 再代入
'b',得到'b' - 最终结果就是
'a'|'b',这就是为什么你的type B还是联合类型的原因。
要达到你想要的"拒绝联合类型输入"(或让联合类型输入返回never)的效果,你需要打破分布式条件类型的触发条件——只要把泛型参数Key包裹在元组(或其他非裸类型容器)里,就能阻止TypeScript拆分联合类型,让整个联合作为一个整体去匹配条件:
type NoUnion<Key> = [Key] extends ['a'] ? 'a' : [Key] extends ['b'] ? 'b' : never; type B = NoUnion<'a'|'b'>; // 此时B的类型是never,符合预期 type A = NoUnion<'a'>; // 'a',单个字面量输入正常返回
原理很简单:分布式条件类型只会在条件类型的左侧是裸类型参数(没有被包裹在数组、元组、对象等结构里的泛型参数)时才会触发。用[Key]包裹后,左侧不再是裸类型,联合类型就不会被拆分,而是作为一个整体去匹配['a']或['b'],自然匹配失败返回never。
内容的提问来源于stack exchange,提问作者Daniel Birowsky Popeski
相关产品推荐
相关产品推荐

