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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:56:58