為什麼在TypeScript中,void和{}無法被推論為never類型?
P粉548512637
2023-09-04 16:03:52
<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
與物件類型相交,因為物件類型透過新增屬性來相交:相反,原始類型透過減少可能的值集合來相交:
而透過將原始類型與物件類型相交,你可以為原始類型新增屬性:
但是一個原始型別永遠不能成為另一個原始型別。因此,相交兩個不同的原始類型將導致
never
最後,
void
是一個原始型別。所以,這表示
void & { foo: number }
意味著原始型別void
也會有屬性foo
。然而,
void & string
將產生never
,因為它們是兩種不同的原始類型。但是,
void & String
是void
加上String
的屬性,因為String
是一個物件類型(透過new String()
建立)。然而,這一切都沒有意義。你不能給
void
分配除了undefined
之外的任何東西,而undefined
不能有屬性。所以我認為在你的程式碼庫中void & Type
沒有存在的理由。如果你認為你需要它,我會問你為什麼需要它,並嘗試重構程式碼以不需要它。