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
解决了问题,谢谢,