元素隐式地具有“ any”类型,因为类型对象没有索引签名

时间:2019-03-10 01:22:39

标签: typescript

我试图使用打字稿简单地索引到字典中,这是一个幼稚的示例,在行910上失败。我收到错误Element implicitly has an 'any' type because type object has no index signature.Element implicitly has an 'any' type because type {} has no index signature.

1        var configs = {
2            'stuff': {
3                'stuff1': 12,
4                'stuff2': 13,
5            }
6        };
7        var locked = new Object();
8        for (var config in configs) {
9            configs[config]['stuff1'] += 1;
10           locked[config] = true;
11       }

其他SO答案提供了一些建议,例如将lockedconfigs设置为自定义Dict类型(type Dict = { [key: string]: object };)。这也不起作用,并提供了相同的错误。

1 个答案:

答案 0 :(得分:1)

三种解决方法:

使用显式any而不是隐式:

var configs: any = {
    'stuff': {
        'stuff1': 12,
        'stuff2': 13,
    }
};
var locked: any = {};
for (var config in configs) {
    configs[config].stuff1 += 1;
    locked[config] = true;
}

您还可以在tsconfig中禁用noImplicitAny

在您自己的代码中显式或隐式使用any会破坏打字稿的目的,我不建议这样做。

最好的解决方案是定义一个对您的情况尽可能严格的类型。对于您的示例,可能是这样的:

interface Config {
    stuff1: number;
    stuff2: number;
}

var configs: { [key: string]: Config } = {
    stuff: {
        stuff1: 12,
        stuff2: 13,
    }
};
var locked: { [key: string]: boolean } = {};
for (var config in configs) {
    configs[config].stuff1 += 1;
    locked[config] = true;
}

但是您可能必须根据实际情况调整配置。