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

x9ybnkn6  于 2023-02-25  发布在  TypeScript
关注(0)|答案(7)|浏览(604)

考虑以下代码:

const timer: number = setTimeout(() => '', 1000);

打印脚本引发错误:Type 'Timer' is not assignable to type 'number'.快速查找告诉我setTimeout返回NodeJS.Timer
但是如果我正在做基于浏览器的开发,使用NodeJS.Timer感觉不对,哪种类型定义或返回类型才是不使用any声明而使setTimeout工作的正确类型?

yqhsw0fo

yqhsw0fo1#

最简单的解决方案是允许类型推断工作,并且根本不指定任何类型,如果你需要指定一个类型,因为浏览器和节点声明的类型不一致,你可以使用ReturnType来指定变量的类型是setTimeout的返回类型:

const timer: ReturnType<typeof setTimeout> = setTimeout(() => '', 1000);

或者,也可以使用window.setTimeout来代替setTimeout,它返回正确的返回类型。

3ks5zfa0

3ks5zfa02#

可以使用window.setTimeout,它返回number类型。

let a: number;
a = window.setTimeout(function() {}, 0);
mo49yndu

mo49yndu3#

这是因为Typescript将搜索node_modules/@types下的所有类型定义
如果您在~/node_modules/@types/node/globals.ts中安装了NodeJS类型定义(随许多npm包提供),并且您的项目位于~/Projects/myproject中,则setTimeout的NodeJS定义将泄漏。
默认情况下,所有可见的"@types "包都包含在编译中,任何文件夹的node_modules/@types中的包都被认为是可见的;具体地说,这意味着./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/内的包,依此类推。
参见:www.example.comhttps://www.typescriptlang.org/tsconfig#types
如果Typescript找到自定义类型定义,则其优先级高于默认类型定义。

解决方案:

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

解决方法:

  • 请改用window.setTimeout()
bhmjp9jg

bhmjp9jg4#

window.setTimeout返回number。理想情况下,您希望定义自己的类型以将其与number区分开来(并防止一些操作,如+,这对计时器没有意义)。

type TimerHandle = number;
tjrkku2a

tjrkku2a5#

对于任何其他有这个错误的人,我的工作是在tsconfig.js文件中添加:

"compilerOptions": {

   ...
   "types": [],
}
jc3wubiy

jc3wubiy6#

在我的例子中,我在Node中工作,所以我使用NodeJS.Timeout

new9mtju

new9mtju7#

使用前缀窗口时的类型。

setTimeout初始化(您可以选择初始化为null

let timeout: NodeJS.Timeout | number | null = null;

用法

timeout = window.setTimeout(() => console.log("Timeout"), 1000);

清除

window.clearTimeout(timeout);

相关问题