如何在 WebStorm 中对抗大量未解决的变量警告?

IT技术 javascript webstorm
2021-02-19 18:28:23

我有一个从服务器获取数据的函数:

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

WebStorm 说这someVar是一个未解析的变量。我怎样才能摆脱这样的警告?

我看到几个选项:

  • 禁止 IDE 设置中的警告;
  • 添加带有字段的 JSON 源文件(详细信息);
  • 使用阵列状语法:data['some_unres_var'];

此外,WebStorm 为我提供了为“数据”创建命名空间(添加类似 的注释/** @namespace data.some_unres_var*/)、创建此类字段或重命名它。

6个回答

使用JSDoc

/**
 * @param {{some_unres_var:string}} data
 */
function getData(data){
    console.log(data.some_unres_var);
}
有没有类似的方法来定义全局变量?我在我的 Web 应用程序中引用了一个外部库,我需要使用诸如 之类的东西MediumEditor,但是 intellij 给了我臭名昭著的未解析变量警告。
2021-04-22 18:28:23
@borislemke:此答案不适用于不是参数的变量。一般的解决方案是使用 @namespace
2021-04-27 18:28:23
当函数是匿名函数时,你会怎么做?如在 ........ .then(function(data){ .... })
2021-05-14 18:28:23
对于变量使用此语法 /** * @type {Object} * @property {string} sortval - value to sort by */ var a;
2021-05-18 18:28:23

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
2021-05-12 18:28:23

对于一般情况,所有其他答案都是不正确的。如果你没有得到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;
}
@philo.O:这是一个 JSDoc 解决方案,由 WebStorm 解析。但是使用 TypeScript 完全避免了这个问题。
2021-04-22 18:28:23
这是特定于 webstorm 的解决方案还是编辑器标准解决方案?这就是我仍然不确定的......
2021-05-02 18:28:23
感谢您提供此解决方案。我有一个从API返回的许多属性,以便使用技术我相信我会需要列出很多人为了避免我看到这样的错误:```/ ** @namespace req.headers.signaturecertchainurl / / @ namespace req.headers.signature // @namespace req.headers.slots // @namespace req.headers. Nutritionslot **/ ``` 有没有办法创建更高级别的命名空间(例如req.headers)并自动将子项分配给它?(抱歉没有在评论中格式化!)
2021-05-11 18:28:23

解构使用,卢克。

function getData(data){
    const {member} = data;
    console.log(member);
}
为了帮助解决我遇到的复杂问题,如果您正在解构的变量具有 Eslint 非法名称,例如my_var,您可以将其重命名:const { my_var: myVar } = data.
2021-05-16 18:28:23

使用带有匿名函数表达式的虚拟 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

Elena 在 JetBrains 论坛上的建议是一个奇怪的解决方案一般的解决方案是使用 @namespace
2021-05-06 18:28:23