如何使用jsdom和typescript防止“类型'Global'上不存在属性'...'?

自行车逃生:

我尝试将现有项目转换为使用Typescript,但是在测试设置中却遇到了问题。

我有一个用于测试的安装文件,该文件用于设置jsdom,以便我所有的DOM交互代码在测试期间均可工作。使用Typescript(带有摩卡的ts节点),我总是会收到这样的错误:

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/');
史蒂芬·斯潘金(Steven Spungin):

避免错误的原始答案

将其放在打字稿文件的顶部

const globalAny:any = global;

然后使用globalAny代替。

globalAny.document = jsdom('');
globalAny.window = global.document.defaultView;

更新答案以维护类型安全

如果要保持类型安全,可以扩展现有的NodeJS.Global类型定义。

您需要将定义放入全局范围内 declare global {...}

请记住,打字稿global作用域与NodeJS接口Globalglobal property称为... global类型的节点不同Global

declare global {
  namespace NodeJS {
    interface Global {
       document: Document;
       window: Window;
       navigator: Navigator;
    } 
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章