如何检测代码是否在TypeScript的浏览器中运行?

How to detect if code runs in browser in TypeScript?

提问人:jcubic 提问时间:8/7/2022 更新时间:8/7/2022 访问量:572

问:

我正在将 ES5 JavaScript 代码重写为 TypeScript,并有这样的代码:

var is_browser = (function() {
    try {
        return this === window;
    } catch (e) {
        return false;
    }
})();

首先,我从 TS 收到一个隐式 any 类型的错误。但我认为这并不重要,因为代码将不起作用,因为 TypeScript 用于每个文件,因此 .this"use strict"thisundefined

那么,测试JavaScript代码是否在浏览器中运行的正确方法是什么呢?

JavaScript TypeScript 严格模式

评论

0赞 Ahmed Lazhar 8/7/2022
你不能用 JavaScript 写这部分,而只是在 TypeScript 中添加文件声明吗?
1赞 Ahmed Lazhar 8/7/2022
或者你可以使用globalThis.window === globalThis
2赞 Christian Vincenzo Traina 8/7/2022
变量本身的存在表明您处于浏览器中。该代码所做的正是这个,它是取消引用,如果它抛出,那么变量就不存在,你就不在浏览器中windowwindow
1赞 MauricioRobayo 8/7/2022
您还可以检查窗口是否未定义:typeof window !== 'undefined'
0赞 jcubic 8/7/2022
@CristianTraìna确定的,但是jsDOM呢,我想检测浏览器,而不是窗口对象。

答:

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