Come combattere tonnellate di avvisi di variabili irrisolte in Webstorm?


110

Ho una funzione che prende i dati dal server:

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

Webstorm dice che someVar- è una variabile irrisolta. Cosa posso eliminare da tali avvertimenti?

Vedo diverse opzioni:

  • Sopprimere gli avvisi nelle impostazioni ide;
  • Aggiungi un file sorgente JSON con campi ( dettagli );
  • Utilizzare gli array-come sintassi: data['some_unres_var'];

Anche Webstorm mi offre di creare lo spazio dei nomi per i "dati" (aggiungere un'annotazione come /** @namespace data.some_unres_var*/), creare tale campo o rinominarlo.


2
@hellboy Risposta rapida: fai clic con il pulsante destro del mouse -> Usa libreria Javascript -> assicurati che HTML sia selezionato. Seguilo guardando le librerie javascript disponibili nelle impostazioni del progetto per avere una migliore comprensione di cosa sta succedendo.
owensmartin

Risposte:


102

Usa JSDoc:

/**
 * @param {{some_unres_var:string}} data
 */
function getData(data){
    console.log(data.some_unres_var);
}

8
Per le variabili utilizzare questa sintassi/** * @type {Object} * @property {string} sortval - value to sort by */ var a;
Ferenc Takacs

3
Come lo faresti quando la funzione è una funzione anonymouns? come in ........ .then (function (data) {....})
David V.

1
Esiste un metodo simile per definire le variabili globali? Sto facendo riferimento a una libreria esterna nella mia app Web, ho bisogno di usare cose come MediumEditor, ma intellij mi dà il famigerato avviso di variabile non risolta.
borislemke

@borislemke: questa risposta non funzionerà per variabili che non sono parametri. La soluzione generale è usare @namespace .
Dan Dascalescu

45

JSDoc l'oggetto. Poi i suoi membri.

/**
 * @param data          Information about the object.
 * @param data.member   Information about the object's members.
 */
function getData(data){
    console.log(data.member);
}
  • @property per variabili locali (non parametri)
  • Testato in PyCharm. @Nicholi conferma che funziona in Webstorm.
  • Il {{ member:type }} sintassi suggerita da Andreas potrebbe entrare in conflitto con i modelli Django.
  • Grazie alla risposta di Jonny Buchanan che cita il wiki @param .

Per documentare matrici di oggetti , utilizzare le []parentesi come suggerisce JSDoc :

/**
 * @param data
 * @param data.array_member[].foo
 */

E le variabili che non sono parametri? La soluzione generale è usare @namespace .
Dan Dascalescu

1
Posso confermare che questa notazione per oggetti complessi funziona in WebStorm.
Nicholi

18

Tutte le altre risposte non sono corrette per il caso generale. E se non ottieni datacome parametro? Allora non hai 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 avvertirà che "result.entries" è una variabile (campo) non risolta.

La soluzione generale è aggiungere una @namespacedichiarazione:

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

2
Grazie per questa soluzione. Ho molti attributi restituiti da un'API, quindi utilizzando la tua tecnica presumo che dovrei elencarne molti per evitare gli errori che vedo in questo modo: `` / ** @namespace req.headers.signaturecertchainurl / / @ namespace req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** / `` C'è un modo per creare uno spazio dei nomi di livello superiore (ad esempio req.headers) e assegnargli automaticamente dei figli? (scusa per nessuna formattazione nei commenti!)
James

@ James: questa è una buona domanda, e ho anche cercato (senza successo) almeno un elenco di più che sul campo per riga.
Dan Dascalescu

6

l'utilizzo di un file js fittizio con un'espressione di funzione anonima che restituisce il letterale json, come scritto su http://devnet.jetbrains.com/message/5366907 , può essere una soluzione. Posso anche suggerire di creare una variabile falsa che conterrà questo valore json e utilizzare questa var come valore dell'annotazione @param per far sapere a WebStorm qual è il tipo effettivo. Piace:

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

Vedi anche http://devnet.jetbrains.com/message/5504337#5504337


1
Il suggerimento di Elena sul forum JetBrains è una soluzione strana . La soluzione generale è usare @namespace .
Dan Dascalescu

3

Uso destrutturante, Luke.

function getData(data){
    const {member} = data;
    console.log(member);
}

-1

Per rimuovere gli avvisi sull'IDE WebStorm puoi semplicemente deselezionare le opzioni di ispezione per:

  • Funzione Javascript non risolta
  • Variabile Javascript non risolta

ps . questo rimuoverà gli avvisi sull'IDE, ma non credo che sia l'idea migliore, perché perderemo una delle migliori utilità in un IDE come Webstorm, che può peggiorare la qualità del nostro codice.

Anche così, se vuoi seguire nel menu: File > Impostazioni > Editor > Ispezioni possiamo disabilitare gli avvisi Javascript

Come la seguente immagine:

deseleziona le opzioni


Questa è una cattiva idea, poiché rimuoverà gran parte dell'utilità dell'utilizzo di un IDE per la modifica di JS. Il punto è che l'uso della notazione a punti JavaScript confonde l'ispezione, non che l'ispezione debba essere disabilitata.
Will Harris
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.