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

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

JSDoc объект. Тогда его участники.

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

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

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

Ответ 3

Все остальные ответы неверны для общего случая. Что делать, если вы не получаете 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;
}

Ответ 4

использование фиктивного 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

Ответ 5

Разрушительное использование, Люк.

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