2017-01-30 2 views
1

ich versuche, ein Array aller Schlüssel in einem Objekt mit verschachtelten Eigenschaften zu erhalten, meinen Code:Typoskript: Was könnte diesen Fehler verursachen? „Element hat implizit einen‚beliebigen‘Typen, weil Typ‚Objekt‘keinen Index Signatur“

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; 
     } 
    } 
} 

Obj [k] gibt mir jedoch den Fehler "Element hat implizit einen 'any' Typ, weil Typ 'Objekt' keine Indexsignatur hat". Ich habe einige andere Threads mit dem gleichen Fehler angeschaut, aber es scheint, dass ihre Situationen anders sind

Ich habe die Funktion in playground versucht, aber es hat dieses Problem nicht dort. Aber in Webstorm und es gibt diesen Fehler; Was könnte das verursachen?

Antwort

3

Ich bin mir ziemlich sicher, dass das ist, was Sie wollen:

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; 
} 

Beachten Sie, dass ich es änderte den Schlüssel selbst (k) anstelle des Wertes (obj[k]) und dem rekursiven Ergebnis zu schieben ist concated in das Array.
Auch die return keys ist jetzt nach der for-Schleife, und nicht in der else.

Sie sollten Object nicht als Typ verwenden, verwenden Sie stattdessen any als written in the docs:

Sie könnten Object erwarten eine ähnliche Rolle zu spielen, wie es in anderen Sprachen tut. Aber Variablen vom Typ Object erlauben es nur, ihnen irgendeinen Wert zuzuweisen - Sie können keine willkürlichen Methoden auf ihnen aufrufen, sogar die die tatsächlich existieren.

Die Funktion kann Object.keys Verwendung vereinfacht werden:

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; 
} 
+0

ich sehe, während ich meinen Kopf nicht ganz kann umschlingen nicht 'Object' als eine Art verwenden, um es zu' any' Veränderung beschloss der Problem Danke, – icda

Verwandte Themen