函数内的 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 上下文中使用它,以避免在那里意外使用浏览器全局变量。
我的意图是
尽可能保持函数匿名,因为它作为 evaluateInBrowser
参数
最易读
保持函数为函数,而不是字符串
避免 Node.js 全局上下文与浏览器类型的污染(无 dom
TS 库)
避免 Node.js 模块上下文与浏览器类型的污染(无 declare var window
)如果可能
将 window
和 localStorage
分别键入 Window
和 Storage
,如果可能,不要键入 any
解决此 TypeScript 问题的选项是什么?
解决方案是使用未使用的局部变量来欺骗类型检查:
{
let localStorage: { clear(): void };
let window: { foo() };
// Node context
evaluateInBrowser(() => {
// browser context
window.foo();
localStorage.clear();
});
}
它们可以另外用一个块包裹起来,以避免在 Node 上下文中意外使用或与此范围内的其他变量发生冲突。
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 上下文中使用它,以避免在那里意外使用浏览器全局变量。
我的意图是
尽可能保持函数匿名,因为它作为
evaluateInBrowser
参数 最易读
保持函数为函数,而不是字符串
避免 Node.js 全局上下文与浏览器类型的污染(无
dom
TS 库)避免 Node.js 模块上下文与浏览器类型的污染(无
declare var window
)如果可能将
window
和localStorage
分别键入Window
和Storage
,如果可能,不要键入any
解决此 TypeScript 问题的选项是什么?
解决方案是使用未使用的局部变量来欺骗类型检查:
{
let localStorage: { clear(): void };
let window: { foo() };
// Node context
evaluateInBrowser(() => {
// browser context
window.foo();
localStorage.clear();
});
}
它们可以另外用一个块包裹起来,以避免在 Node 上下文中意外使用或与此范围内的其他变量发生冲突。