当前位置: 首页 > 知识库问答 >
问题:

TypeScript-使用setTimeout的正确版本(节点vs窗口)

秦安宁
2023-03-14

我正在努力升级一些旧的TypeScript代码,以使用最新的编译器版本,我在调用setTimeout时遇到了麻烦。代码期望调用浏览器的setTimeout函数,该函数返回一个数字:

setTimeout(处理程序:(…参数:任意[])=

但是,编译器正在将其解析为节点实现,它返回一个NodeJS。计时器:

setTimeout(回调:(…参数:任意[])=

这段代码没有在节点中运行,但是节点类型作为对其他东西的依赖被拉进来(不确定是什么)。

如何指示编译器选择我想要的setTimeout版本?

以下是相关代码:

let n: number;
n = setTimeout(function () { /* snip */  }, 500);

这将产生编译器错误:


共有3个答案

左凯定
2023-03-14

我想这取决于你将在哪里运行你的代码。

如果您的运行时目标是服务器端节点JS,请使用:

let timeout: NodeJS.Timeout;
global.clearTimeout(timeout);

如果运行时目标是浏览器,请使用:

let timeout: number;
window.clearTimeout(timeout);
公冶俊达
2023-03-14

2021更新

Akxe的答案建议返回

let n: ReturnType<typeof setTimeout>;
n = setTimeout(cb, 500);

它很好,似乎比显式铸造更受欢迎。但这种情况下"n"的结果类型是"NodeJS. Timeout",可以按如下方式使用:

let n: NodeJS.Timeout;
n = setTimeout(cb, 500);

Timeout方法的唯一问题是在浏览器特定环境中的数字操作仍然需要强制转换:

if ((n as unknown as number) % 2 === 0) {
  clearTimeout(n);
}

原始答案

不影响变量声明的变通方法:

let n: number;
n = setTimeout(function () { /* snip */  }, 500) as unknown as number;

此外,在特定于浏览器的环境中,可以使用窗口对象,而无需强制转换:

let n: number;
n = window.setTimeout(function () { /* snip */  }, 500);
翟嘉年
2023-03-14
let timer: ReturnType<typeof setTimeout> = setTimeout(() => { ... });

clearTimeout(timer);

通过使用ReturnType

消息,这也与Deno兼容!

 类似资料:
  • 我在安装了Javajdk(和jre)1.6的Unix机器上通过Eclipse Juno生成了一个ant文件。当在build.xml文件所在的eclipse之外的机器上运行ant时,一切都很顺利。 现在,问题是当我尝试在另一台机器上运行ant时,其中jdk和jre 1.6都安装了。这是我在运行RedHat 3的另一台机器上得到的结果(无法更改): 当我在build.xml文件中添加这一行时,我得到以

  • 是否可以正确地升级,而不是手动安装最新的稳定版本? 我已安装节点。js版本和,但现在我想将其更新为。我试图避免手动重新安装所有全局软件包(例如,通过运行grunt cli bower yoman angular generator blablablablablablablablablablabla)。

  • 问题内容: VS Code是否可以使用NVM指定的节点版本? 我在本地安装了6.9.2。即使从OS X终端(不是VS Code终端)切换到另一个版本后,重新启动VS Code,VS Code仍会使用6.9.2显示。 OS X终端 VS Code终端 问题答案: 解决方法是设置别名。在OS终端中运行- 打开vscode,现在运行返回 似乎vscode占用了此(别名默认值)值,而不是由设置的节点版本

  • 问题内容: 我正在尝试使其工作,但似乎无法在SO的任何地方找到解决方案。尝试编译此单文件应用程序时: 使用命令“ tsc app.ts –module’commonjs’”,我得到以下错误(不使用– module标志给我一个额外的错误,告诉我我需要它来编译外部模块): 问题答案: TypeScript需要知道它存在。 为节点安装类型definitinos: 旧答案 遵循这两个步骤 从此处下载文件:

  • 问题内容: 因此,可以尝试获取以下JSON对象: 有没有一种方法可以使用node或express在服务器的响应中生成完全相同的主体?显然,可以设置标头并指示响应的内容类型将为“ application / json”,但是存在多种写入/发送对象的方法。我经常看到的一种是通过使用以下形式的命令: 但是,这有两点可以使人争辩说它们是“问题”: 我们正在发送一个字符串。 此外,最后没有换行符。 另一个想

  • 在太平洋标准时间每天午夜会自动构建TypeScript的master分支代码并发布到NPM和NuGet上。 下面将介绍如何获得并在工具里使用它们。 使用 npm npm install -g typescript@next 使用 NuGet 和 MSBuild 注意:你需要配置工程来使用NuGet包。 详细信息参考配置MSBuild工程来使用NuGet。 www.myget.org。 有两个包: