2015-10-26 72 views
1

我想定義一個有一些已知成員的接口,而未知成員應該映射回相同的類型。我想能夠定義:自引用索引類型

interface Foo { 
    name?: string; 
    [others: string]: Foo; 
} 

這將讓我來定義:

var myFoo: Foo = { 
    name: 'foo1' 
    anotherfoo: { 
     name: 'foo2' 
     yetanotherfoo: { 
      name: 'foo3' 
     } 
    } 
} 

但是,我的接口出現故障時,出現以下錯誤消息編譯:

物業「字符串」類型的「名稱」不能分配給字符串索引類型'Foo'

我已經成功地做到這一點,到目前爲止的唯一方法是定義我的索引類型與任何類型:

[others: string]: any; 

這使得代碼編譯,但顯然失去了進一步下跌的元素任何類型的安全性和智能。

我不想改變我的數據結構的建議 - 這實際上是爲了更正敲除映射庫的打字稿定義,因爲不允許未定義的成員,所以不再適用於TS1.6。

回答

2
interface Foo { 
    name?: string; 
    [others: string]: Foo; 
} 

聲明是自相矛盾的:它說,這種類型的每一個聲明的屬性是Foo,但namestring

要解決,表明所有聲明的屬性要麼stringFoo

interface Foo { 
    name?: string; 
    [others: string]: Foo|string; 
} 
+0

感謝 - 這不是最巧妙的解決方案(實際的類我的工作有5種或6個類型,包括委託) ,但它比使用任何東西都要好! – Richard