我尝试将现有的项目转换为使用Typescript,但我在测试设置时遇到了问题。
我有一个用于测试的设置文件,用于设置jsdom,以便所有与DOM交互的代码在测试期间都能正常工作。使用Typescript (带有mocha的ts-node)时,我总是得到这样的错误:
Property 'window' does not exist on type 'Global'.
为了防止出现这种情况,我尝试像这样修补NodeJS.Global接口:
declare namespace NodeJS{
interface Global {
document: Document;
window: Window;
navigator: Navigator;
}
}
但这并没有改变任何事情。
如何在NodeJS全局变量上启用这些浏览器属性?
附加内容:
这是我的摩卡setup.ts
import { jsdom, changeURL } from 'jsdom';
const exposedProperties = ['window', 'navigator', 'document'];
global.document = jsdom('');
global.window = global.document.defaultView;
Object.keys(global.document.defaultView).forEach((property) => {
if (typeof global[property] === 'undefined') {
exposedProperties.push(property);
global[property] = global.document.defaultView[property];
}
});
global.navigator = {
userAgent: 'node.js',
};
changeURL(global.window, 'http://example.com/');
发布于 2017-02-18 01:54:04
避免错误的原始答案
将此代码放在typescript文件的顶部
const globalAny:any = global;
然后改用globalAny。
globalAny.document = jsdom('');
globalAny.window = global.document.defaultView;
更新答案以维护类型安全
如果希望保持类型安全,可以扩充现有的NodeJS.Global
类型定义。
您需要将您的定义放入全局作用域 declare global {...}
中
请记住,typescript global
作用域与NodeJS接口Global
或名为global
的Global
类型的节点global property
不同...
declare global {
namespace NodeJS {
interface Global {
document: Document;
window: Window;
navigator: Navigator;
}
}
}
发布于 2018-07-30 02:40:18
除了其他答案之外,您还可以直接在作业站点cast global
:
(global as any).myvar = myvar;
发布于 2017-10-06 04:34:39
我通过这样做修复了这个问题...
export interface Global {
document: Document;
window: Window;
}
declare var global: Global;
https://stackoverflow.com/questions/40743131
复制相似问题