2015-03-08 52 views
1

首先,關於使用TypeScript的這一新功能稱爲聯合類型,沒有官方指南(截至2015年3月8日的AFAIK)。那麼,我試圖找到一種自己使用它們的方式。這並不容易。我仍然在努力尋找union類型的地方在我的代碼:TypeScript中聯合類型的用法是什麼?

剩下什麼?

  • 混合原語(通過typeof運算解構)
  • 混合類(通過的instanceof解構)

我說得對,那些2是在目前的打字稿消費聯盟類型的唯一有效的方法?

如果是這樣,是否有計劃擴展其適用性?

如果不是,我錯過了什麼?

+0

不是一個答案,只是指出在d。ts文件,他們是非常棒的,因爲你曾經被卡在「任何」。例如,如果屬性類型是字符串或HTMLDivElement。另外,根據圖書館的不同,您需要一噸過載湯。這已經全部用聯合類型清理了。你的問題是偉大的,因爲我從來沒有考慮非d.ts文件的使用情況,不知道爲什麼他們會被使用。 – user1059939 2015-03-09 12:34:16

回答

2

我不認爲你可以得到一個單一的答案;至少,union類型處理許多不同的用例,使用戶能夠以類似於他們編寫規範JavaScript的方式編寫TypeScript。無論如何,這是一個嘗試解釋。

當您有兩種類型的結構上(和理想上功能上)相似的類型時,一個好處是您可以使用它們共享的交集屬性作爲抽象點。

如果您有兩種類型在結構上不相似但在他們的信息可以如何處理方面有相似之處,那麼將這些信息規範化爲一種通用的抽象形式可能很有用。

舉個例子,ES6標籤模板非常相似調用的表達式:

f `hello ${ 123 } ${ 456 } world!` 

上述標籤模板desugars類似於下面的內容:

var _t = ["hello ", " ", " world!"]; 
_t.raw = ["hello ", " ", " world!"]; 
f(_t, 123, 456); 

你可以想像,在一個編譯器,如果它們在方便時可以被同等地處理來調用表達式,那麼這將是理想的,但是當兩者足夠明顯時可以專門處理它們。讓我們嘗試模擬這種:

interface TemplateExpression extends Expression { 
    // ... 
} 

interface TaggedTemplateExpression extends Expression{ 
    callTarget: Expression; 
    template: TemplateExpression; 
} 

interface CallExpression extends Expression { 
    callTarget: Expression; 
    arguments: Expression[]; 
} 

type CallLikeExpression = CallExpression | TaggedTemplateExpression; 

function getEffectiveCallArguments(expr: CallLikeExpression): Expression[] { 
    if (expr.kind === SyntaxKind.CallExpression { 
     // ... 
    } 
    else { 
     // ... 
    } 

    // OR, if you don't want to have a tag, 
    // you could check expr's properties 
    if ((<CallExpression>expr).arguments) { 
     // treat as CallExpression 
    } 
    else { 
     // treat as TaggedTemplateExpression 
    } 
} 

兩個CallExpressionTaggedTemplateExpression有一個共同的callTarget,所以你總是可以得到通過只使用callTarget財產從CallLikeExpression被調用的表達。

如果您希望得到調用的參數,您可以使用getEffectiveCallArguments來提取它,它意識到如何處理兩者之間的差異。

相關問題