2015-10-26 102 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