首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用jsdom和typescript防止“属性'...‘不存在于类型'Global'”?

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

Stack Overflow用户
提问于 2016-11-22 21:29:33
回答 7查看 63.3K关注 0票数 84

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

我有一个用于测试的设置文件,用于设置jsdom,以便所有与DOM交互的代码在测试期间都能正常工作。使用Typescript (带有mocha的ts-node)时,我总是得到这样的错误:

代码语言:javascript
复制
Property 'window' does not exist on type 'Global'.

为了防止出现这种情况,我尝试像这样修补NodeJS.Global接口:

代码语言:javascript
复制
declare namespace NodeJS{
  interface Global {
    document: Document;
    window: Window;
    navigator: Navigator;
  }
}

但这并没有改变任何事情。

如何在NodeJS全局变量上启用这些浏览器属性?

附加内容:

这是我的摩卡setup.ts

代码语言:javascript
复制
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/');
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-02-18 01:54:04

避免错误的原始答案

将此代码放在typescript文件的顶部

代码语言:javascript
复制
const globalAny:any = global;

然后改用globalAny。

代码语言:javascript
复制
globalAny.document = jsdom('');
globalAny.window = global.document.defaultView;

更新答案以维护类型安全

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

您需要将您的定义放入全局作用域 declare global {...}

请记住,typescript global作用域与NodeJS接口Global或名为globalGlobal类型的节点global property不同...

代码语言:javascript
复制
declare global {
  namespace NodeJS {
    interface Global {
       document: Document;
       window: Window;
       navigator: Navigator;
    } 
  }
}
票数 126
EN

Stack Overflow用户

发布于 2018-07-30 02:40:18

除了其他答案之外,您还可以直接在作业站点cast global

代码语言:javascript
复制
(global as any).myvar = myvar;
票数 50
EN

Stack Overflow用户

发布于 2017-10-06 04:34:39

我通过这样做修复了这个问题...

代码语言:javascript
复制
export interface Global {
  document: Document;
  window: Window;
}

declare var global: Global;
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40743131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档