2015-01-07 76 views
3

功能compose可以具有一個或多個對象作爲它的參數的陣列。 在compose中,類型防護區分對象和數組。 函數mapper只能處理對象,並且通過使用類型保護,只有對象被提取。打字稿:如何型保護聯合類型

interface Link { 
    something: string; 
} 

function compose(link: Link|Link[]) { 
    if (link instanceof Array) { 
    R.map(function(l) { 
     return mapper(l); 
    }, link); 
    } else { 
     return mapper(link); 
    } 
} 

function mapper(link: Link) { 
    return link; 
} 

編譯這個例子中導致錯誤:

錯誤TS2345:Link類型的」參數|鏈接[]」是不能分配給類型的參數‘鏈接’

此錯誤是可以理解的映射獲得一個聯合類型作爲參數,但只有一個單一對象的期望。這不是我使用警衛時所希望的。對此有何想法?

+0

你可以做一個TSC --version和報告您正在使用的版本? – Martin

+0

消息TS6029:版本1.4.0.0 – donnut

回答

4

看來TypeScript 1.4.0.0並不推斷link的類型不是Array時它必須是Link。一個小的變化應解決:

function compose(link: Link|Link[]) { 
    if (link instanceof Array) { 
    R.map(function(l) { 
     return mapper(l); 
    }, link); 
    } else if (link instanceof Link) { 
     return mapper(link); 
    } 
} 

或者,您可以斷言類型:

return mapper(<Link> link); 
+0

我發現替代最優雅的解決方案。謝謝! – donnut

+0

請注意,在'.tsx'中,您必須使用'link as Link'。 – jgillich