函数内的 TypeScript 全局声明

TypeScript global declaration inside a function

Node.js 脚本包含一个函数,该函数将在浏览器中计算,而不是在 Node.js 中计算(字符串化并发送到客户端)。

它合理地触发了 TypeScript 类型错误,因为函数体使用了仅存在于浏览器上下文中的未定义变量:

// Node context
evaluateInBrowser(() => {
  // browser context
  window.foo(); // cannot find name 'window'
  localStorage.clear(); // cannot find name 'localStorage'
});

这在E2E框架(例如Protractor)中很常见。 declare var window 不允许放入 TypeScript 中的函数中。而且我不想在 Node.js 上下文中使用它,以避免在那里意外使用浏览器全局变量。

我的意图是

解决此 TypeScript 问题的选项是什么?

解决方案是使用未使用的局部变量来欺骗类型检查:

  {
    let localStorage: { clear(): void };
    let window: { foo() };

    // Node context
    evaluateInBrowser(() => {
      // browser context
      window.foo();
      localStorage.clear();
    });
  }

它们可以另外用一个块包裹起来,以避免在 Node 上下文中意外使用或与此范围内的其他变量发生冲突。