为什么在TypeScript中,void和{}无法被推断为never类型?
<p>当我在使用TypeScript的void类型与其他类型使用交叉类型时,我得到了不同的结果。</p>
<pre class="brush:php;toolbar:false;">type A = void & {} // A 是 void & {}
type B = void & '1' // B 是 never
type C = void & 1 // C 是 never
type D = void & string // D 是 never
type E = void & String // E 是 void & String</pre>
<pre class="brush:php;toolbar:false;">type A = void & {}
type E = void & String</pre>
<p>它们也应该是never类型,对吗?</p>
{}和String都是对象类型,而string和'1'都是原始类型。你可以将void与对象类型相交,因为对象类型通过添加属性来相交:type A = { foo: number } & { bar: string } // { foo: number, bar: string }相反,原始类型通过减少可能的值集合来相交:
而通过将原始类型与对象类型相交,你可以为原始类型添加新属性:
type C = string & { foo: number } declare const c: C c.foo // number但是一个原始类型永远不能成为另一个原始类型。因此,相交两个不同的原始类型将导致
never最后,
void是一个原始类型。所以,这意味着
void & { foo: number }意味着原始类型void也将具有属性foo。然而,
void & string将产生never,因为它们是两种不同的原始类型。但是,
void & String是void加上String的属性,因为String是一个对象类型(通过new String()创建)。然而,这一切都没有什么意义。你不能给
void分配除了undefined之外的任何东西,而undefined不能有属性。所以我认为在你的代码库中void & Type没有存在的理由。如果你认为你需要它,我会问你为什么需要它,并尝试重构代码以不需要它。