Javascript Typescript:什么可能导致此错误&引用;元素隐式地具有一个';任何';因为类型';对象';“没有索引签名”;
我正在尝试获取具有嵌套属性的对象中所有键的数组,我的代码:Javascript Typescript:什么可能导致此错误&引用;元素隐式地具有一个';任何';因为类型';对象';“没有索引签名”;,javascript,json,recursion,typescript,javascript-objects,Javascript,Json,Recursion,Typescript,Javascript Objects,我正在尝试获取具有嵌套属性的对象中所有键的数组,我的代码: public static getKeys(obj: Object) { let keys: string[] = []; for (let k in obj) { if (typeof obj[k] == "Object" && obj[k] !== null) { keys.push(obj[k]); CHelpers.getKeys(&
public static getKeys(obj: Object) {
let keys: string[] = [];
for (let k in obj) {
if (typeof obj[k] == "Object" && obj[k] !== null) {
keys.push(obj[k]);
CHelpers.getKeys(<Object>obj[k]);
} else {
return keys;
}
}
}
publicstaticgetkeys(obj:Object){
let键:字符串[]=[];
for(让k在obj中){
if(对象的类型[k]=“对象”&&obj[k]!==null){
按键推(obj[k]);
CHelpers.getKeys(obj[k]);
}否则{
返回键;
}
}
}
然而,obj[k]给了我一个错误“元素隐式地有一个'any'类型,因为类型'Object'没有索引签名”。我看过其他一些有相同错误的线程,但它们的情况似乎不同
我在中尝试了该函数,但它没有这个问题。但是在Webstorm中,它给出了这个错误;是什么原因造成的?我很确定这就是你想要的:
function getKeys(obj: any) {
let keys: string[] = [];
for (let k in obj) {
keys.push(k);
if (typeof obj[k] == "object") {
keys = keys.concat(getKeys(obj[k]));
}
}
return keys;
}
请注意,我将其更改为按键本身(k
),而不是按值(obj[k]
),递归结果集中到数组中。另外,
返回键现在位于for循环之后,而不在else中
您不应将对象
用作类型,而应将任何
用作:
您可能期望对象扮演类似的角色,就像它在其他应用程序中一样
语言。但是Object类型的变量只允许您分配任何
对它们的价值-您不能对它们调用任意方法,即使是
这实际上是存在的
可以使用对象简化该功能。键
:
function getKeys(obj: any) {
let keys = Object.keys(obj);
Object.keys(obj).forEach(key => {
if (typeof obj[key] === "object") {
keys = keys.concat(getKeys2(obj[key]));
}
});
return keys;
}
我明白了,虽然我不能完全理解不使用Object
作为类型,但将其更改为any
解决了问题,谢谢,