Как бороться с множеством предупреждений о неразрешенных переменных в Webstorm?


110

У меня есть функция, которая принимает данные с сервера:

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

Webstorm говорит, что someVar- это неразрешенная переменная. Что я могу избавить от таких предупреждений?

Вижу несколько вариантов:

  • Подавить предупреждения в настройках ide;
  • Добавьте исходный файл json с полями ( подробности );
  • Используйте массивы-как синтаксис: data['some_unres_var'];

Также Webstorm предлагает мне создать пространство имен для «данных» (добавить аннотацию, например /** @namespace data.some_unres_var*/), создать такое поле или переименовать его.


2
@hellboy Быстрый ответ: щелкните правой кнопкой мыши -> Использовать библиотеку Javascript -> убедитесь, что HTML отмечен. Следуйте за этим, просмотрев доступные библиотеки javascript в настройках проекта, чтобы лучше понять, что происходит.
owensmartin

Ответы:


102

Используйте JSDoc:

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

8
Для переменных используйте этот синтаксис/** * @type {Object} * @property {string} sortval - value to sort by */ var a;
Ferenc Takacs

3
Как бы вы это сделали, если функция является анонимной функцией? как в ........ .then (function (data) {....})
Дэвид В.

1
Есть ли аналогичный метод определения глобальных переменных? Я ссылаюсь на внешнюю библиотеку в своем веб-приложении, мне нужно использовать такие вещи, как MediumEditor, но intellij выдает мне печально известное предупреждение о неразрешенной переменной.
borislemke 09

@borislemke: этот ответ не будет работать для переменных, не являющихся параметрами. Общее решение - использовать @namespace .
Дэн Даскалеску

46

JSDoc объект. Потом его участники.

/**
 * @param data          Information about the object.
 * @param data.member   Information about the object's members.
 */
function getData(data){
    console.log(data.member);
}
  • @property для локальных переменных (без параметров)
  • Протестировано в PyCharm. @Nicholi подтверждает, что он работает в Webstorm.
  • В {{ member:type }}синтаксических Андреас предложил может конфликтовать с шаблонами Django.
  • Благодаря ответу Джонни Бьюкенена со ссылкой на вики @param .

Для документирования массивов объектов используйте []скобки, как предлагает JSDoc :

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

А как насчет переменных, не являющихся параметрами? Общее решение - использовать @namespace .
Дэн Даскалеску

1
Я могу подтвердить, что эта нотация для сложных объектов работает в WebStorm.
Nicholi

18

Все остальные ответы в общем случае неверны. Что, если вы не получите dataпараметр? Тогда у вас нет 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 предупредит, что "result.entries" - это неразрешенная переменная (поле).

Общее решение - добавить @namespaceобъявление:

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
Спасибо за это решение. У меня есть много атрибутов, возвращаемых из API, поэтому, используя вашу технику, я полагаю, мне нужно было бы перечислить их множество, чтобы избежать ошибок, которые я вижу следующим образом: `` / ** @namespace req.headers.signaturecertchainurl / / @ namespace req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** / `` Есть ли способ создать пространство имен более высокого уровня (например req.headers) и автоматически назначить ему потомков? (извините за отсутствие форматирования в комментариях!)
Джеймс

@James: это хороший вопрос, и я также искал (безуспешно), чтобы по крайней мере перечислить больше, чем по полю в строке.
Дэн Даскалеску

6

решением может быть использование фиктивного файла js с выражением анонимной функции, возвращающим литерал json, как написано на http://devnet.jetbrains.com/message/5366907 . Я также могу предложить создать поддельную переменную, которая будет содержать это значение json, и использовать эту переменную в качестве значения аннотации @param, чтобы WebStorm узнал, что такое фактический тип. Подобно:

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

См. Также http://devnet.jetbrains.com/message/5504337#5504337


1
Предложение Елены на форуме JetBrains - странное решение . Общее решение - использовать @namespace .
Дэн Даскалеску


-1

Чтобы удалить предупреждения в IDE WebStorm, вы можете просто снять отметку с опций проверки для:

  • Неразрешенная функция Javascript
  • Неразрешенная переменная Javascript

п.с. . это удалит предупреждения в IDE, но я не думаю, что это лучшая идея, потому что мы потеряем одну из лучших утилит в IDE, например Webstorm, что может ухудшить качество нашего кода.

Тем не менее, если вы хотите следовать в меню: Файл > Настройки > Редактор > Инспекции, мы можем отключить предупреждения Javascript.

Как на следующей картинке:

снять галочки


Это плохая идея, так как она устранит большую часть полезности использования IDE для редактирования JS. Дело в том, что использование точечной нотации JavaScript сбивает проверку с толку, а не в том, что ее нужно отключать.
Уилл Харрис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.