Javascript 有没有办法让像VSCode这样的IDE识别不带';还不存在吗?(节点)

Javascript 有没有办法让像VSCode这样的IDE识别不带';还不存在吗?(节点),javascript,node.js,Javascript,Node.js,所以我知道这个问题可能非常令人困惑,但基本上我的节点项目中有一个文件,当导入其中一个导出时,它会将全局范围中变量的值设置为getter。基本上,这意味着您可以反复调用相同的值并得到不同的结果。例如: magicIncrement.js: let count = -1; module.exports = { get magicIncrement() { Object.defineProperty(global, 'increment', { get: () =>

所以我知道这个问题可能非常令人困惑,但基本上我的节点项目中有一个文件,当导入其中一个导出时,它会将全局范围中变量的值设置为getter。基本上,这意味着您可以反复调用相同的值并得到不同的结果。例如:

magicIncrement.js:

let count = -1;

module.exports = {
  get magicIncrement() {
    Object.defineProperty(global, 'increment', { 
      get: () => {
        count += 1;
        return count;
      },
    });
  },
};
let { magicIncrement } = require('./magicIncrement');

console.log( 'increment:', increment );
const test = increment;
console.log('"test"s value doesn\'t change.')
console.log('test:', test);
console.log('test:', test);
setTimeout(() => {
  console.log('...but "increment"s value always will')
  console.log( 'increment:', increment );
}, 1010);
index.js:

let count = -1;

module.exports = {
  get magicIncrement() {
    Object.defineProperty(global, 'increment', { 
      get: () => {
        count += 1;
        return count;
      },
    });
  },
};
let { magicIncrement } = require('./magicIncrement');

console.log( 'increment:', increment );
const test = increment;
console.log('"test"s value doesn\'t change.')
console.log('test:', test);
console.log('test:', test);
setTimeout(() => {
  console.log('...but "increment"s value always will')
  console.log( 'increment:', increment );
}, 1010);
结果是每次调用变量时增量都会增加

问题是IDE无法识别该变量,因为就VSCode所知,“增量”在技术上并不存在。有没有办法解决这个问题


另外,我尝试简单地将导出(在本例中为“magic increment”)设置为全局变量/getter的名称(在本例中为“increment”),但似乎在文件中设置一个变量(如在index.js中通过销毁)只是切断了全局变量[var name]和[var name]之间的链接.

在模块系统中工作并编写脚本时,通常应尽可能在模块系统中工作。只有在没有其他选择的情况下才求助于全球污染

在这里,您可以通过返回导出对象(而不是全局对象)上的getter来完成所需的操作:


但是这类代码非常令人困惑——在编写可靠的、可维护的代码时,不应该故意隐藏某个getter或属性访问正在执行副作用(例如增加
count
变量)的事实。当然,您可以将其隐藏在抽象后面,但不要试图编写混乱而棘手的代码(比如在全局对象上有一个getter)来隐藏它。

可能类似于,但您确实不应该在模块系统中依赖非标准全局属性,在大多数情况下,您可以使用环境变量。@HamzaAnis实际的用例是调用该变量,该变量将自动注入一个“选项”设置为true的对象和一个散列。我的npm模块使用它来解构对象模型,并找出哪些嵌套对象是选项对象,哪些不是。比较类似
constmodel={user:{increment,键入:'string'}
to
const model={user:{…increment(),键入:'string'}}
。我正在尝试实现前一个版本的语法。@CertainPerformance谢谢你提出类似的问题(我不知道你们怎么这么容易找到这些问题)。另外,在不依赖全局属性方面,是否有其他方法可以实现导出伪装为变量的getter/函数?一天结束时,我真正想做的就是创建一个变量,每当调用它时它都会改变值。我通过谷歌
vscode-augment-global-type-javascript
找到了它,还有其他相关问题