如何在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 2014年

Answers:


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;
费伦茨塔卡克斯

3
当函数是匿名函数时,您将如何处理?就像在........ .then(function(data){....})中一样
David V.

1
是否有类似的方法来定义全局变量?我在网络应用程序中引用了一个外部库,我需要使用诸如之类的东西MediumEditor,但是intellij给了我臭名昭著的未解决的变量警告。
borislemke

@borislemke:这个答案不适用于不是参数的变量。通用解决方案是使用@namespace
Dan Dascalescu '17

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 }}Andreas建议的语法可能与Django模板冲突。
  • 感谢Jonny Buchanan 引用@param Wiki回答

要记录对象数组,请使用[]JSDoc 建议的括号:

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

那些不是参数的变量呢?通用解决方案是使用@namespace
Dan Dascalescu '17

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 / / @命名空间req.headers.signature / / @namespace req.headers.slots / / @namespace req.headers.nutrientslot ** /```有没有一种方法来创建一个更高层次的命名空间(如req.headers),并自动分配的孩子呢?(对不起,您的评论中没有格式!)
James James

@James:这是一个很好的问题,我也(至少没有成功)寻找至少每行列出更多的字段。
Dan Dascalescu

6

使用http://devnet.jetbrains.com/message/5366907编写的,带有匿名函数表达式并返回json文字的虚拟js文件可能是一种解决方案。我还可以建议创建一个伪造的变量来保存此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
Elena在JetBrains论坛上的建议是一个奇怪的解决方案。通用解决方案是使用@namespace
Dan Dascalescu,2017年

3

破坏性使用,卢克。

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

-1

要删除WebStorm IDE上的警告,您只需取消选中以下检查选项:

  • 无法解析的Javascript函数
  • 未解析的Javascript变量

ps。这将消除IDE上的警告,但是我认为这不是最好的主意,因为我们将失去Webstorm等IDE中最好的实用程序之一,这可能会使我们的代码质量恶化。

即使如此,如果您要在菜单中执行以下操作:文件 > 设置 > 编辑器 > 检查,我们可以禁用Javascript警告

如下图:

取消选中选项


这是一个坏主意,因为它将消除使用IDE编辑JS的许多实用性。关键是使用JavaScript点符号会混淆检查,而不是应禁用检查。
Will Harris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.