2016-03-01 131 views
7

什麼來處理,你有兩個接口是非常相似,以至於你想通過同一塊邏輯來運行它們的情況下正確的方法處理:打字稿聯盟類型:與接口

interface DescriptionItem { 
    Description: string; 
    Code: string; 
} 
interface NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name; 

    return i.Code + ' - ' + desc; 
} 

這工作;不過,我的問題在於改進var desc = ...系列。我有什麼最好的選擇?或者是否有更好的方法來處理Typescript中的這種情況?

+0

我會說,你所採取的方式看起來很好。然而,問題本身主要是基於意見的,我將在此基礎上投票結束。 :) – toskv

回答

5

TypeScript interfaces僅在編譯時存在,所以在運行時測試接口類型的操作並不多。您在問題中指定的代碼很有意義,可能是您的最佳選擇。

但是,如果能夠靈活地改變你的interfacesclasses,您可以使用打字稿的類型衛士做更優雅的類型檢查:

class DescriptionItem { 
    Description: string; 
    Code: string; 
} 
class NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    let desc: string; 
    if (i instanceof DescriptionItem) { 
     desc = i.Description; 
    } else { 
     desc = i.Name; 
    } 

    return i.Code + ' - ' + desc; 
} 
+0

爲什麼你不能檢查'i.Name'是否存在,並根據它來區分類型? – jocull

+0

@jocull如果該對象是'NamedItem'的一個實例,但是它的'Name'是'undefined',會怎麼樣? –

+0

如果它缺少非可選數據,那它真的是'NamedItem'的一個實例嗎? – jocull