提问人:jcubic 提问时间:8/7/2022 更新时间:8/7/2022 访问量:572
如何检测代码是否在TypeScript的浏览器中运行?
How to detect if code runs in browser in TypeScript?
问:
我正在将 ES5 JavaScript 代码重写为 TypeScript,并有这样的代码:
var is_browser = (function() {
try {
return this === window;
} catch (e) {
return false;
}
})();
首先,我从 TS 收到一个隐式 any 类型的错误。但我认为这并不重要,因为代码将不起作用,因为 TypeScript 用于每个文件,因此 .this
"use strict"
this
undefined
那么,测试JavaScript代码是否在浏览器中运行的正确方法是什么呢?
答:
1赞
MauricioRobayo
8/7/2022
#1
如果您在浏览器上,则窗口不应未定义:
var is_browser = typeof window !== 'undefined';
console.log(is_browser)
评论
0赞
jcubic
8/7/2022
这将破坏,当在使用 jsDOM 的 jest 框架中进行测试时,它也会破坏。var windows = 10;
0赞
MauricioRobayo
8/7/2022
公平点@jcubic,感谢您的反馈。虽然你的问题的标题是“如何检测代码是否在 TypeScript 的浏览器中运行?你明确地问“测试JavaScript代码是否在浏览器中运行的正确方法是什么?你从来没有提到过 Jest 或 jsDOM。当然,窗口可以由其他人定义,与globalThis相同。
0赞
Ahmed Lazhar
8/7/2022
窗口始终可以定义为指向 globalThis
0赞
jcubic
8/7/2022
当然,但这不是我期望您在学习 JavaScript 的 1 个月内学会的答案。我想要一些在任何地方都适用的东西。也许我应该在问题中写下这一点。但是添加请不要回答有点傻。也许从现在开始我应该写一份我不想看到的答案清单。typeof window
0赞
MauricioRobayo
8/8/2022
是的,有时很难做简单的事情。youtu.be/AkYDsiRVqno?t=1037
3赞
Ahmed Lazhar
8/7/2022
#2
无论全球环境受到污染,此解决方案应始终有效
var is_browser = Object.getPrototypeOf(
Object.getPrototypeOf(globalThis)
) !== Object.prototype
评论
0赞
lwdthe1
3/27/2023
这正是我一直在寻找的,因此即使有人手动全局定义,它也能在 NodeJs 中工作window
评论
globalThis.window === globalThis
window
window
typeof window !== 'undefined'