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


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

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

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

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

  • отключить предупреждения;
  • добавить исходный файл json с полями (подробнее подробности);
  • использовать массивы, как синтаксис:data['some_unres_var']jslint предупредите меня, чтобы не делал это);
  • ???

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

4 86

4 ответа:

Использовать JSDoc:

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

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. @Николай подтверждает, что он работает в Webstorm.
  • The {{ member:type }} синтаксис Андреас предложил может конфликтовать с шаблонами Django.
  • Спасибо Джонни Бьюкенену ответ со ссылкой на @param wiki.

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

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

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

общее решение состоит в том, чтобы добавить @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;
}

использование фиктивного js-файла с анонимным выражением функции, возвращающим литерал json, как написано в http://devnet.jetbrains.com/message/5366907, может быть решение. Я также могу предложить создать поддельную переменную, которая будет содержать это значение json, и использовать этот var в качестве значения аннотации @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