2016-09-28 101 views
2

說我有下面的代碼:如何在TypeScript中區分兩種不同的對象類型?

function myFunction(x: { foo: number } | { bar: string }) {

我怎麼能寫一些代碼,以確定是否x是第一或第二類型?

事情我已經考慮:

  • 寫一個x is MyType功能來檢查foo屬性。是的,我可以做到這一點,但對於僅用作單個函數參數的類型來說似乎過分了。
  • if ((x as { foo: number}).foo) { let y = x as { foo: number }。我可以做到這一點,但它打敗了類型系統的觀點。
  • 給他們一個共同的type財產。同樣,對於僅用作一個函數參數的類型來說似乎是過度殺傷性的。

回答

3

這是一個變通,但你可以通過擴展現有的類型與類型化到never使每個類型理論上已在美利堅合衆國的每場可能的可選字段統一類型的字段:

{ foo: number, bar?: never } | { bar: string, foo?: never } 

通過使超類型包含的所有字段可以運行類型檢查,如:

type CompletelyDisjointed = { foo: number, bar?:never } | { foo?: never, bar: string }; 

function myFunction(x: CompletelyDisjointed): string | number { 
    if (typeof x.bar === 'string') { 
     return x.bar; 
    } else { 
     return x.foo; 
    } 
} 
+1

你也可以有原來的參數類型未修改如果喲你喜歡並在一個單獨的賦值中使用兼容的統一類型:'let tx:{f​​oo?:number,bar ?: string} = x; if(typeof tx.foo!=='undefined'){...'。此外,從來沒有暗示聯合類型是不相交的 - x可能同時具有「foo」和「bar」。如果你想不相交,你必須在答案中使用確切的形式。 – artem

+0

這很聰明。總有一天會有更好的解決方案出現,但現在看起來很合適。 – thedayturns

相關問題