¿Cómo luchar contra toneladas de advertencias de variables no resueltas en Webstorm?

110

Tengo una función que toma datos del servidor:

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

Webstorm dice que someVar- es una variable sin resolver. ¿Qué puedo eliminar de tales advertencias?

Veo varias opciones:

  • Suprime las advertencias en la configuración de ide;
  • Agregue un archivo fuente json con campos ( detalles );
  • Usar grupos-como sintaxis: data['some_unres_var'];

También Webstorm me ofrece crear un espacio de nombres para los "datos" (agregar una anotación como /** @namespace data.some_unres_var*/), crear dicho campo o cambiarle el nombre.

Sergei Panfilov
fuente
2
@hellboy Respuesta rápida: haga clic con el botón derecho -> Usar biblioteca de Javascript -> asegúrese de que HTML esté marcado. Siga esto mirando las bibliotecas de JavaScript disponibles en la configuración del proyecto para comprender mejor lo que está sucediendo.
Owensmartin

Respuestas:

102

Utilice JSDoc:

/**
 * @param {{some_unres_var:string}} data
 */
function getData(data){
    console.log(data.some_unres_var);
}
Andreas Berheim Brudin
fuente
8
Para las variables, use esta sintaxis/** * @type {Object} * @property {string} sortval - value to sort by */ var a;
Ferenc Takacs
3
¿Cómo haría eso cuando la función es una función anónima? como en ......... then (function (data) {....})
David V.
1
¿Existe un método similar para definir variables globales? Estoy haciendo referencia a una biblioteca externa en mi aplicación web, necesito usar cosas como MediumEditor, pero intellij me da la infame advertencia de variable no resuelta.
borislemke
@borislemke: esta respuesta no funcionará para variables que no sean parámetros. La solución general es usar @namespace .
Dan Dascalescu
45

JSDoc el objeto. Luego sus miembros.

/**
 * @param data          Information about the object.
 * @param data.member   Information about the object's members.
 */
function getData(data){
    console.log(data.member);
}
  • @property para variables locales (no parámetros)
  • Probado en PyCharm. @Nicholi confirma que funciona en Webstorm.
  • La {{ member:type }}sintaxis sugerida por Andreas puede entrar en conflicto con las plantillas de Django.
  • Gracias a la respuesta de Jonny Buchanan citando la wiki de @param .

Para documentar matrices de objetos , use []corchetes como sugiere JSDoc :

/**
 * @param data
 * @param data.array_member[].foo
 */
Bob Stein
fuente
¿Qué pasa con las variables que no son parámetros? La solución general es usar @namespace .
Dan Dascalescu
1
Puedo confirmar que esta notación para objetos complejos funciona en WebStorm.
Nicholi
18

Todas las demás respuestas son incorrectas para el caso general. ¿Qué pasa si no lo obtiene datacomo parámetro? Entonces no tienes 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 advertirá que "result.entries" es una variable (campo) sin resolver.

La solución general es agregar una @namespacedeclaración:

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
fuente
2
Gracias por esta solucion. Tengo muchos atributos devueltos desde una API, por lo que al usar su técnica, supongo que necesitaría enumerar muchos de ellos para evitar los errores que veo así: `` / ** @namespace req.headers.signaturecertchainurl / / @ namespace req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** / `` ¿Hay alguna forma de crear un espacio de nombres de nivel superior (por ejemplo req.headers) y asignarle niños automáticamente? (¡perdón por no dar formato a los comentarios!)
James
@James: esa es una buena pregunta, y también busqué (sin éxito) al menos enumerar más que en el campo por línea.
Dan Dascalescu
6

usar un archivo js ficticio con una expresión de función anónima que devuelva el literal json, como está escrito en http://devnet.jetbrains.com/message/5366907 , puede ser una solución. También puedo sugerir la creación de una variable falsa que contenga este valor json, y usar esta var como un valor de la anotación @param para que WebStorm sepa cuál es el tipo real. Me gusta:

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

Véase también http://devnet.jetbrains.com/message/5504337#5504337

lena
fuente
1
La sugerencia de Elena en el foro JetBrains es una solución extraña . La solución general es usar @namespace .
Dan Dascalescu
3

Uso desestructurador, Luke.

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

Para eliminar las advertencias en The WebStorm IDE, simplemente puede desmarcar las opciones de inspección para:

  • Función de Javascript sin resolver
  • Variable de JavaScript no resuelta

ps . esto eliminará las advertencias en el IDE, pero no creo que sea la mejor idea, porque perderemos una de las mejores utilidades en un IDE como Webstorm, lo que puede empeorar la calidad de nuestro código.

Aun así, si quieres seguir en el menú: Archivo > Configuración > Editor > Inspecciones podemos desactivar las advertencias de Javascript.

Como la siguiente imagen:

desmarcar opciones

Valdeci
fuente
Esta es una mala idea, ya que eliminará gran parte de la utilidad de usar un IDE para editar JS. El punto es que el uso de la notación de puntos de JavaScript confunde la inspección, no que la inspección deba desactivarse.
Will Harris