搜尋

首頁  >  問答  >  主體

為什麼在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>
P粉548512637P粉548512637454 天前643

全部回覆(1)我來回復

  • P粉285587590

    P粉2855875902023-09-05 12:01:48

    {}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 沒有存在的理由。如果你認為你需要它,我會問你為什麼需要它,並嘗試重構程式碼以不需要它。

    回覆
    0
  • 取消回覆