TypeScript中的setTimeout应该使用什么返回类型?

Har*_*til 18 typescript

考虑以下代码:

const timer: number = setTimeout(() => '', 1000);
Run Code Online (Sandbox Code Playgroud)

Typescript会抛出错误:Type 'Timer' is not assignable to type 'number'.快速查找告诉我setTimeout返回NodeJS.Timer.

但是,如果我正在进行基于浏览器的开发,使用NodeJS.Timer感觉不对.哪个是正确的类型定义或返回类型,setTimeout无需借助any声明即可完成工作?

Tit*_*mir 29

最简单的解决方案是允许类型推断工作,而根本不指定任何类型.如果需要指定类型,看到浏览器和节点声明之间的类型不一致,您可以使用ReturnType指定变量的类型setTimeout是返回类型的类型:

const timer: ReturnType<typeof setTimeout> = setTimeout(() => '', 1000);
Run Code Online (Sandbox Code Playgroud)

或者,window.setTimeout也可以使用而不仅仅是setTimeout.它返回正确的返回类型.

  • 从 4.0.x 开始,如果您尝试将 `setTimeout()` 的返回类型传递给 `clearTimeout()`,TypeScript 将无法编译,因此需要转换为 `number`。这可能是 TypeScript 核心类型声明中的一个错误。 (3认同)
  • 我尝试使用window.setTimeout而不是setTimeout。window.setTimeout似乎返回数字作为类型。我应该知道有什么区别吗? (2认同)
  • 提香,如果可以的话,我会投票两次,祝福你! (2认同)

And*_*kyi 10

您可以使用window.setTimeout它返回的类型number

let a: number;
a = window.setTimeout(function() {}, 0);
Run Code Online (Sandbox Code Playgroud)


de *_*art 8

发生这种情况是因为 Typescript 将在下面搜索类型定义 node_modules/@types

如果您将 NodeJS 类型定义(带有许多 npm 包)安装到~/node_modules/@types/node/globals.ts并且您的项目在~/Projects/myproject定义中,则会泄漏。

默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/ 等中的包。

请参阅:https : //www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types

如果 Typescript 找到自定义类型定义,则其优先于默认类型定义。 setTimeout() 的 VS Code 2 类型定义

解决方案:

  • 指定 compilerOption 搜索类型定义的路径: "typeRoots":[]
  • 指定要从默认路径加载的类型定义的 compilerOption: "types": []
  • 从默认搜索路径中删除定义文件