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
)
分别输入window
和localStorage
Window
和Storage
,而不是any
,如果可能的话
修复此TypeScript问题有哪些选项?
答案 0 :(得分:0)
解决方案是使用未使用的局部变量进行类型检查:
{
let localStorage: { clear(): void };
let window: { foo() };
// Node context
evaluateInBrowser(() => {
// browser context
window.foo();
localStorage.clear();
});
}
它们可以另外用块包装,以避免在Node上下文中意外使用或与此范围内的其他变量发生冲突。