Як боротися з трьома невирішеними змінними, що попереджають у Веб-штурмі?


110

У мене є функція, яка бере дані з сервера:

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

Веб-штурм каже, що someVar- це невирішена змінна. Що я можу позбутися від таких попереджень?

Я бачу кілька варіантів:

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

Також веб-штурм пропонує мені створити простір імен для "даних" (додати анотацію на зразок /** @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 (функція (дані) {....})
David V.

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

@borislemke: ця відповідь не буде працювати для змінних, які не є параметрами. Загальне рішення - використовувати @namespace .
Дан Даскалеску

45

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.
  • Завдяки Jonny Б'юкенена відповідь з посиланням на @param вікі .

Для документування масивів об'єктів використовуйте []дужки, як пропонує JSDoc :

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

Що з змінними, які не є параметрами? Загальне рішення - використовувати @namespace .
Дан Даскалеску

1
Я можу підтвердити це позначення для роботи складних об'єктів у WebStorm.
Ніколі

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 / / @ простір імен req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** / `` `є спосіб , щоб створити простір імен вищого рівня (наприклад req.headers) і автомагіческій привласнення дитина до неї? (вибачте за відсутність форматування в коментарях!)
James

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

6

використання фіктивного 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


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.