2016-05-16 53 views
0

假設我有一個實現IItem接口對象的數組:迭代中打字稿特定接口的項目

interface IItem { 
    getId() : string; 
} 

interface ISortableItem extends IItem { 
    getSortIndex() : number; 
} 

var items : IItem[] = [ ... ]; 

現在我想僅獲得實現ISortableItem界面中的項目,但我不」 t認爲這些信息在運行時已經可用了。我可以用這樣的:

for (var i of items) { 
    if ((<ISortableItem>i).getSortIndex) { 
    ... 
    } 
} 

雖然它的作品,我的程序員的心臟開始流血;-)是否有解決這一問題的一個更優雅的方式?

回答

0

我會推薦在你的情況下使用一個類。

class Item { 
    getId() { .. } 
} 

class SortableItem extends Item { 
    getSortIndex() { ... } 
} 

... 

items.filter(item => item instanceof SortableItem) 

通過這樣做,您將允許運行時檢測和編譯時間。

+0

我不能使用一個類,因爲每個類實現'getId'不同。也可以在'IItem'接口中添加'getSortIndex'作爲可選方法。不知何故,分離界面看起來更乾淨。 –

+0

好吧,這個問題和我的答案無論如何都是有見地的,但請記住,您可以通過實現接口('class Item implements IItem')來構建您的類。恕我直言,使用TypeScript最重要的是接口和類的組織。所以有時來自JS的代碼模式不適合用於TypeScript。 – drinchev