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

TypeScript中为何void & {}未被推断为never类型?

TypeScript中void交叉类型的特殊表现解析

在TypeScript里,void类型的本质是标记无返回值函数的返回类型,它代表“不存在任何有效返回值”,但和表示“完全不可能存在的值”的never类型有本质区别,这也导致它和不同类型交叉时表现不一样:

  • 当void和原始类型/原始类型字面量(比如'1'、1、string)交叉时,结果是never:
    原始类型的取值都是具体的“有效值”,而void代表没有值,两者完全没有交集,所以交叉后自然是never。

  • 当void和{}(空对象类型)或String(字符串包装对象类型)交叉时,结果不会简化为never:

    1. 对于void & {}:
      {}在TypeScript里表示“除了null和undefined之外的所有值”,而void实际允许的取值只有undefined(严格模式)或undefined+null(非严格模式)。但TypeScript的类型系统没有直接判定这两者无交集,而是保留了void & {}的写法——这是因为void的“无返回值”语义和{}的“非空值”语义没有被编译器设定为直接互斥,属于类型系统的设计决策。
    2. 对于void & String:
      String是引用类型的包装对象,和{}的逻辑类似,TypeScript认为void和引用类型的交叉不能直接判定为完全无交集,因此保留了组合后的类型,没有简化为never。

简单来说,这是TypeScript类型系统针对void语义的特殊处理,目的是在特定场景下保留类型的语义信息,而非强行简化为never。

内容的提问来源于stack exchange,提问作者lumozx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:37:16