我不認爲你可以得到一個單一的答案;至少,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
}
}
兩個CallExpression
和TaggedTemplateExpression
有一個共同的callTarget
,所以你總是可以得到通過只使用callTarget
財產從CallLikeExpression
被調用的表達。
如果您希望得到調用的參數,您可以使用getEffectiveCallArguments
來提取它,它意識到如何處理兩者之間的差異。
不是一個答案,只是指出在d。ts文件,他們是非常棒的,因爲你曾經被卡在「任何」。例如,如果屬性類型是字符串或HTMLDivElement。另外,根據圖書館的不同,您需要一噸過載湯。這已經全部用聯合類型清理了。你的問題是偉大的,因爲我從來沒有考慮非d.ts文件的使用情況,不知道爲什麼他們會被使用。 – user1059939 2015-03-09 12:34:16