函数内的TypeScript全局声明

时间:2018-03-19 22:29:47

标签: node.js typescript protractor e2e-testing

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

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

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

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

我的意图是

  • 保持函数匿名(如果可能),因为它最具可读性evaluateInBrowser参数

  • 将函数保持为函数,而不是字符串

  • 使用浏览器类型(无dom TS库)来避免污染Node.js全局上下文

  • 避免使用浏览器类型污染Node.js模块上下文(如果可能,不使用declare var window

  • 分别输入windowlocalStorage WindowStorage,而不是any ,如果可能的话

修复此TypeScript问题有哪些选项?

1 个答案:

答案 0 :(得分:0)

解决方案是使用未使用的局部变量进行类型检查:

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

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

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