2

我想定义一个具有一些已知成员的接口,未知成员应该映射回相同的类型。我希望能够定义:

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

这将允许我定义:

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

但是,我的界面无法编译并显示以下错误消息:

“字符串”类型的属性“名称”不可分配给字符串索引类型“Foo”

到目前为止,我设法做到这一点的唯一方法是使用任何类型定义我的索引类型:

[others: string]: any;

这允许代码编译,但显然会失去任何类型的安全性和更深层次的元素的智能感知。

我不想要更改我的数据结构的建议 - 这实际上是为了更正敲除映射库的打字稿定义,由于不允许未定义的成员,它不再适用于 TS1.6。

4

1 回答 1

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

这个声明是自相矛盾的:它说这个类型的每个声明的属性都是 a Foo,但是name是 a string

要修复,请指明所有声明的属性是stringFoo

interface Foo {
    name?: string;
    [others: string]: Foo|string;
}
于 2015-10-26T23:07:31.303 回答