為什麼在TypeScript中,void和{}無法被推論為never類型?
P粉548512637
P粉548512637 2023-09-04 16:03:52
0
1
636
<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>
P粉548512637
P粉548512637

全部回覆(1)
P粉285587590

{}String 都是物件類型,而 string'1' 都是原始型別。你可以將 void 與物件類型相交,因為物件類型透過新增屬性來相交:

type A = { foo: number } & { bar: string } // { foo: number, bar: string }

相反,原始類型透過減少可能的值集合來相交:

type B = string & 'abc' // 'abc'

而透過將原始類型與物件類型相交,你可以為原始類型新增屬性:

type C = string & { foo: number }
declare const c: C
c.foo // number

但是一個原始型別永遠不能成為另一個原始型別。因此,相交兩個不同的原始類型將導致 never

type D = string & number // never
type E = 1 & 2 // never

最後,void 是一個原始型別。


所以,這表示 void & { foo: number } 意味著原始型別 void 也會有屬性 foo

然而,void & string 將產生 never,因為它們是兩種不同的原始類型。

但是,void & Stringvoid 加上String 的屬性,因為String 是一個物件類型(透過new String() 建立)。


然而,這一切都沒有意義。你不能給 void 分配除了 undefined 之外的任何東西,而 undefined 不能有屬性。所以我認為在你的程式碼庫中 void & Type 沒有存在的理由。如果你認為你需要它,我會問你為什麼需要它,並嘗試重構程式碼以不需要它。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板