2015-11-13 140 views
1

使用對象字面值來幫助簡化接口構建過程時使用泛型。因此,舉例來說,我對於使用字符串作爲鍵的所有對象的基本接口是在通用接口中使用接口

interface IStringTMap<T> { [s: string]: T; }; 

如果我想用這個來執行完全用的功能的對象我會成爲一個新的接口

interface IStringFunctionMap extends IStringTMap<Function> { }; 

但是,有時候我想使用更復雜的對象。例如,假設我想建立的結構如下:從原材料位

interface IFunctionGroups { [s: string]: { [s: string]: Function } }; 

我怎麼會去使用使這個更具可讀性很容易

var obj = { 
    "group_1" : { 
     "func_1" : function() {}, 
     "func_2" : function() {} 
    }, 
    "group_2" : { 
     "func_1" : function() {}, 
     "func_2" : function() {} 
    } 
} 

我可以建立這個界面我現有的IStringTMap界面?

我已經用我的穴居人的邏輯,只是推搡一個接口到另一個

interface IFunctionGroups extends IStringTMap<IStringFunctionMap>; 

試圖給了我以下錯誤:

An interface an only extend an identifier/qualified-name with optional type arguments.

回答

2

添加花括號{ }您接口聲明校正後問題:

interface IStringTMap<T> { [s: string]: T; } 

interface IStringFunctionMap extends IStringTMap<Function> { } 

interface IFunctionGroups extends IStringTMap<IStringFunctionMap> { } 

var obj: IFunctionGroups = { 
    "group_1" : { 
     "func_1" : function() {}, 
     "func_2" : function() {} 
    }, 
    "group_2" : { 
     "func_1" : function() {}, 
     "func_2" : function() {} 
    } 
} 

這編譯沒有錯誤或警告:

var obj = { 
    "group_1": { 
     "func_1": function() { }, 
     "func_2": function() { } 
    }, 
    "group_2": { 
     "func_1": function() { }, 
     "func_2": function() { } 
    } 
}; 
+0

回去,並檢查了我的代碼。在接口聲明 - derp後,我已經將括號留下了。無論哪種方式,您的代碼給了我一個側面,突出了遺漏。謝謝!請檢查並+1。 –

+0

問題:如果我在'interface IFunctionGroups extends IStringTMap {};'後面修改了我的問題以刪除括號,您是否願意編輯您的問題以指出它們缺失?不妨試着使問題相關和有用。 –

+0

當然。這可能對未來的讀者有所幫助。 – Seamus