我试图使用打字稿简单地索引到字典中,这是一个幼稚的示例,在行9
和10
上失败。我收到错误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答案提供了一些建议,例如将locked
和configs
设置为自定义Dict
类型(type Dict = { [key: string]: object };
)。这也不起作用,并提供了相同的错误。
答案 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;
}
但是您可能必须根据实际情况调整配置。