我尝试将现有项目转换为使用Typescript,但在测试设置中遇到问题。
我有一个用于测试的设置文件,它设置了jsdom,这样我所有的DOM交互代码都可以在测试期间正常工作。使用Typescript(ts-node with mocha)时,我总是会遇到如下错误:
Property 'window' does not exist on type 'Global'.
为了防止这一点,我尝试修补NodeJS.Global接口,如下所示:
declare namespace NodeJS{
interface Global {
document: Document;
window: Window;
navigator: Navigator;
}
}
但这并没有改变什么。
如何在NodeJS全局变量上启用这些浏览器属性?
其他项目:
这是我的摩卡咖啡
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/');
9条答案
按热度按时间zte4gxcn1#
原创答案,避免错误
将其放在 typescript 文件的顶部
然后改用globalAny。
已更新答案以维护类型安全
如果要保持类型安全,可以扩充现有的
NodeJS.Global
类型定义。您需要将定义放在全局范围
declare global {...}
内请记住,类型脚本
global
的作用域与NodeJS接口Global
不同,也与Global
类型的名为global
的节点global property
不同...vof42yt12#
除了其他答案外,你也可以直接在作业现场简单地cast
global
:rjzwgtxy3#
我通过执行以下操作解决了此问题...
lrl1mhuk4#
这是正确的解决方案,不使用Typescript的命名空间,它还兼容所有eslint默认规则:
使用它:
rggaifut5#
避免类型转换
any
,它会移除类型的目的。改为安装所需的类型定义(例如yarn add --dev @types/jsdom @types/node
)并导入以用途:qij5mzcb6#
xzv2uavs7#
一个简单的方法可以用来扩展Typescript“窗口”类型
步骤1:追加Windows对象
步骤2:声明
步骤3:添加到窗口对象
或
为我工作。
kcrjzv8t8#
如何在
global
中声明内容1.创建
global
声明文件,例如:src/types/index.d.ts
1.将
global
声明文件添加到tsconfig.json
:从 typescript 文档
可以从模块内部向全局作用域添加声明
因此,例如,如果要向数组接口添加一些额外的内容,则需要执行以下操作:
observable.ts
(示例)src/types/index.d.ts
someWhereInApp.ts
声明变量以从
global
访问它们如果要添加全局变量以用作
global.myVariable
,需要执行以下操作:src/types/index.d.ts
someWhereInApp.ts
个mzaanser9#
我用typescript创建了一个nodeJS应用程序,修复它的方法是更新devDependencies中的
@types/node
以匹配我使用的版本。