Como combater toneladas de advertências de variáveis ​​não resolvidas no Webstorm?

110

Tenho uma função que pega dados do servidor:

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

Webstorm diz que someVar- é uma variável não resolvida. O que posso me livrar desses avisos?

Vejo várias opções:

  • Suprimir avisos nas configurações de ide;
  • Adicione um arquivo fonte json com campos ( detalhes );
  • Use matrizes de como sintaxe: data['some_unres_var'];

Além disso, o Webstorm me oferece a possibilidade de criar um namespace para os "dados" (adicionar uma anotação como /** @namespace data.some_unres_var*/), criar esse campo ou renomeá-lo.

Sergei Panfilov
fonte
2
@hellboy Resposta rápida: clique com o botão direito -> Usar Biblioteca Javascript -> certifique-se de que o HTML esteja marcado. Acompanhe isso observando as bibliotecas javascript disponíveis nas configurações do projeto para obter uma melhor compreensão do que está acontecendo.
Owensmartin

Respostas:

102

Use JSDoc:

/**
 * @param {{some_unres_var:string}} data
 */
function getData(data){
    console.log(data.some_unres_var);
}
Andreas Berheim Brudin
fonte
8
Para variáveis, use esta sintaxe/** * @type {Object} * @property {string} sortval - value to sort by */ var a;
Ferenc Takacs
3
Como você faria isso quando a função é uma função anonymouns? como em ......... então (função (dados) {....})
David V.
1
Existe um método semelhante para definir variáveis ​​globais? Estou MediumEditorfazendo referência a uma biblioteca externa em meu aplicativo da web, preciso usar coisas como , mas intellij me dá o infame aviso de variável não resolvida.
Borislemke,
@borislemke: esta resposta não funcionará para variáveis ​​que não são parâmetros. A solução geral é usar @namespace .
Dan Dascalescu
45

JSDoc o objeto. Em seguida, seus membros.

/**
 * @param data          Information about the object.
 * @param data.member   Information about the object's members.
 */
function getData(data){
    console.log(data.member);
}
  • @property para variáveis ​​locais (não parâmetros)
  • Testado em PyCharm. @Nicholi confirma que funciona no Webstorm.
  • A {{ member:type }}sintaxe que Andreas sugeriu pode entrar em conflito com os templates Django.
  • Obrigado à resposta de Jonny Buchanan citando o wiki @param .

Para documentar matrizes de objetos , use []colchetes como o JSDoc sugere :

/**
 * @param data
 * @param data.array_member[].foo
 */
Bob Stein
fonte
E as variáveis ​​que não são parâmetros? A solução geral é usar @namespace .
Dan Dascalescu
1
Posso confirmar esta notação para objetos complexos funciona no WebStorm.
Nicholi
18

Todas as outras respostas estão incorretas para o caso geral. E se você não obtiver datacomo parâmetro? Você não tem JSDoc então:

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 irá avisar que "result.entries" é uma variável não resolvida (campo).

A solução geral é adicionar uma @namespacedeclaração:

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
fonte
2
Obrigado por esta solução. Tenho muitos atributos retornados de uma API, portanto, usando sua técnica, presumo que precisaria listar muitos deles para evitar os erros que estou vendo como este: `` `/ ** @namespace req.headers.signaturecertchainurl / / @ namespace req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** / `` `Existe uma maneira de criar um namespace de nível superior (por exemplo req.headers) e atribuir filhos a ele de forma automática ? (desculpe a falta de formatação nos comentários!)
James
@James: essa é uma boa pergunta, e também procurei (sem sucesso) pelo menos listar mais do que um campo por linha.
Dan Dascalescu
6

usar um arquivo js fictício com expressão de função anônima retornando o literal json, conforme escrito em http://devnet.jetbrains.com/message/5366907 , pode ser uma solução. Também posso sugerir a criação de uma variável falsa que conterá esse valor json e usar essa var como um valor da anotação @param para permitir que o WebStorm saiba qual é o tipo real. Gostar:

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

Veja também http://devnet.jetbrains.com/message/5504337#5504337

Lena
fonte
1
A sugestão de Elena no fórum JetBrains é uma solução estranha . A solução geral é usar @namespace .
Dan Dascalescu
3

Uso de desestruturação, Luke.

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

Para remover os avisos no IDE WebStorm, você pode simplesmente desmarcar as opções de inspeção para:

  • Função Javascript não resolvida
  • Variável Javascript não resolvida

ps . isso removerá os avisos do IDE, mas não acho que seja a melhor ideia, porque perderemos um dos melhores utilitários em um IDE como o Webstorm, o que pode piorar a qualidade do nosso código.

Mesmo assim, se você quiser seguir no menu: Arquivo > Configurações > Editor > Inspeções podemos desabilitar os avisos de Javascript

Como a seguinte imagem:

desmarque as opções

valdeci
fonte
Esta é uma má ideia, pois removerá muito da utilidade de usar um IDE para editar JS. O ponto é que usar a notação de ponto JavaScript confunde a inspeção, não que a inspeção deva ser desativada.
Will Harris