Warum können „void' und „{}' nicht als „never type' in TypeScript abgeleitet werden?
P粉548512637
2023-09-04 16:03:52
<p>Ich erhalte unterschiedliche Ergebnisse, wenn ich den void-Typ von TypeScript mit Kreuztypen mit anderen Typen verwende. </p>
<pre class="brush:php;toolbar:false;">type A = void & // A ist void &
Typ B = void & '1' // B ist nie
Typ C = void & // C ist nie
Typ D = void & string // D ist nie
Typ E = void & String // E ist void & String</pre>
<pre class="brush:php;toolbar:false;">type A = void &
Typ E = void & String</pre>
<p>Sie sollten auch vom Typ nie sein, oder? </p>
{}
和String
都是对象类型,而string
和'1'
都是原始类型。你可以将void
与对象类型相交,因为对象类型通过添加属性来相交:相反,原始类型通过减少可能的值集合来相交:
而通过将原始类型与对象类型相交,你可以为原始类型添加新属性:
但是一个原始类型永远不能成为另一个原始类型。因此,相交两个不同的原始类型将导致
never
最后,
void
是一个原始类型。所以,这意味着
void & { foo: number }
意味着原始类型void
也将具有属性foo
。然而,
void & string
将产生never
,因为它们是两种不同的原始类型。但是,
void & String
是void
加上String
的属性,因为String
是一个对象类型(通过new String()
创建)。然而,这一切都没有什么意义。你不能给
void
分配除了undefined
之外的任何东西,而undefined
不能有属性。所以我认为在你的代码库中void & Type
没有存在的理由。如果你认为你需要它,我会问你为什么需要它,并尝试重构代码以不需要它。