Wie kann man Tonnen ungelöster Variablen in Webstorm bekämpfen?

110

Ich habe eine Funktion, die Daten vom Server übernimmt:

function getData(data){
    console.log(data.someVar);
}

Webstorm sagt, dass someVar- eine ungelöste Variable ist. Was kann ich solche Warnungen loswerden?

Ich sehe mehrere Optionen:

  • Unterdrücken Sie Warnungen in ide-Einstellungen.
  • Fügen Sie eine JSON-Quelldatei mit Feldern ( Details ) hinzu.
  • Verwenden Sie eine Arrays-ähnliche Syntax : data['some_unres_var'];

Außerdem bietet Webstorm mir an, einen Namespace für die "Daten" zu erstellen (eine Anmerkung wie hinzufügen /** @namespace data.some_unres_var*/), ein solches Feld zu erstellen oder es umzubenennen.

Sergei Panfilov
quelle
2
@hellboy Schnelle Antwort: Rechtsklick -> Javascript Library verwenden -> Stellen Sie sicher, dass HTML aktiviert ist. Schauen Sie sich anschließend die verfügbaren Javascript-Bibliotheken in den Projekteinstellungen an, um ein besseres Verständnis der Vorgänge zu erhalten.
Owensmartin

Antworten:

102

Verwenden Sie JSDoc:

/**
 * @param {{some_unres_var:string}} data
 */
function getData(data){
    console.log(data.some_unres_var);
}
Andreas Berheim Brudin
quelle
8
Verwenden Sie für Variablen diese Syntax/** * @type {Object} * @property {string} sortval - value to sort by */ var a;
Ferenc Takacs
3
Wie würden Sie das tun, wenn die Funktion eine Anonymouns-Funktion ist? wie in ........ .then (Funktion (Daten) {....})
David V.
1
Gibt es eine ähnliche Methode zum Definieren globaler Variablen? Ich verweise auf eine externe Bibliothek in meiner Web-App. Ich muss MediumEditorDinge wie verwenden , aber Intellij gibt mir die berüchtigte Warnung vor ungelösten Variablen.
Borislemke
@borislemke: Diese Antwort funktioniert nicht für Variablen, die keine Parameter sind. Die allgemeine Lösung besteht darin , @namespace zu verwenden .
Dan Dascalescu
45

JSDoc das Objekt. Dann seine Mitglieder.

/**
 * @param data          Information about the object.
 * @param data.member   Information about the object's members.
 */
function getData(data){
    console.log(data.member);
}
  • @property für lokale Variablen (keine Parameter)
  • In PyCharm getestet. @Nicholi bestätigt, dass es in Webstorm funktioniert.
  • Die von {{ member:type }}Andreas vorgeschlagene Syntax kann zu Konflikten mit Django-Vorlagen führen.
  • Vielen Dank an Jonny Buchanans Antwort unter Berufung auf das @ param-Wiki .

Um Dokument Arrays von Objekten , verwenden Sie []Klammern wie JSDoc schlägt vor :

/**
 * @param data
 * @param data.array_member[].foo
 */
Bob Stein
quelle
Was ist mit Variablen, die keine Parameter sind? Die allgemeine Lösung besteht darin , @namespace zu verwenden .
Dan Dascalescu
1
Ich kann bestätigen, dass diese Notation für komplexe Objekte in WebStorm funktioniert.
Nicholi
18

Alle anderen Antworten sind für den allgemeinen Fall falsch. Was ist, wenn Sie nicht dataals Parameter erhalten? Sie haben dann kein JSDoc:

function niceApiCall(parameters) {
  const result = await ...  // HTTP call to the API here
  for (const e of result.entries) {
    .. // decorate each entry in the result
  }
  return result;
}

WebStorm warnt, dass "result.entries" eine ungelöste Variable (Feld) ist.

Die allgemeine Lösung besteht darin, eine @namespaceErklärung hinzuzufügen :

function niceApiCall(parameters) {
  /** @namespace result.entries **/
  const result = await ...  // HTTP call to the API here
  for (const e of result.entries) {
    .. // decorate each entry in the result
  }
  return result;
}
Dan Dascalescu
quelle
2
Danke für diese Lösung. Ich habe viele Attribute von einer API zurückgegeben, daher müsste ich unter Verwendung Ihrer Technik vermutlich viele davon auflisten, um die Fehler zu vermeiden, die ich so sehe: `` `/ ** @namespace req.headers.signaturecertchainurl / / @ Namespace req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** / `` `Gibt es eine Möglichkeit, einen übergeordneten Namespace (z. B. req.headers) zu erstellen und ihm automatisch untergeordnete Elemente zuzuweisen? (Entschuldigung für keine Formatierung in Kommentaren!)
James
@ James: Das ist eine gute Frage, und ich habe auch (ohne Erfolg) nach mindestens mehr Auflistungen als auf dem Feld pro Zeile gesucht.
Dan Dascalescu
6

Die Verwendung einer Dummy-JS-Datei mit anonymem Funktionsausdruck, der das JSON-Literal zurückgibt, wie unter http://devnet.jetbrains.com/message/5366907 beschrieben , kann eine Lösung sein. Ich kann auch vorschlagen, eine gefälschte Variable zu erstellen, die diesen JSON-Wert enthält, und diese Variable als Wert für die @ param-Annotation zu verwenden, um WebStorm über den tatsächlichen Typ zu informieren. Mögen:

var jsontext = {"some_unres_var":"val"};
/** @param {jsontext} data */
function getData(data){
    console.log(data.some_unres_var);
}

Siehe auch http://devnet.jetbrains.com/message/5504337#5504337

Lena
quelle
1
Elenas Vorschlag im JetBrains-Forum ist eine seltsame Lösung . Die allgemeine Lösung besteht darin , @namespace zu verwenden .
Dan Dascalescu
3

Zerstörungsgebrauch, Luke.

function getData(data){
    const {member} = data;
    console.log(member);
}
lazy.lizard
quelle
-1

Um die Warnungen in der WebStorm-IDE zu entfernen, können Sie einfach die Kontrolloptionen deaktivieren für:

  • Ungelöste Javascript-Funktion
  • Nicht aufgelöste Javascript-Variable

ps . Dadurch werden die Warnungen in der IDE entfernt, aber ich denke nicht, dass dies die beste Idee ist, da wir eines der besten Dienstprogramme in einer IDE wie Webstorm verlieren werden, was die Qualität unseres Codes verschlechtern kann.

Trotzdem, wenn Sie im Menü folgen möchten: Datei > Einstellungen > Editor > Inspektionen , können Sie die Javascript-Warnungen deaktivieren

Wie das folgende Bild:

Deaktivieren Sie die Optionen

valdeci
quelle
Dies ist eine schlechte Idee, da dadurch die Nützlichkeit der Verwendung einer IDE zum Bearbeiten von JS erheblich beeinträchtigt wird. Der Punkt ist, dass die Verwendung der JavaScript-Punktnotation die Inspektion verwirrt und nicht, dass die Inspektion deaktiviert werden sollte.
Will Harris