考虑以下代码:
const timer: number = setTimeout(() => '', 1000);
打印脚本引发错误:Type 'Timer' is not assignable to type 'number'.
快速查找告诉我setTimeout
返回NodeJS.Timer
。
但是如果我正在做基于浏览器的开发,使用NodeJS.Timer
感觉不对,哪种类型定义或返回类型才是不使用any
声明而使setTimeout
工作的正确类型?
考虑以下代码:
const timer: number = setTimeout(() => '', 1000);
打印脚本引发错误:Type 'Timer' is not assignable to type 'number'.
快速查找告诉我setTimeout
返回NodeJS.Timer
。
但是如果我正在做基于浏览器的开发,使用NodeJS.Timer
感觉不对,哪种类型定义或返回类型才是不使用any
声明而使setTimeout
工作的正确类型?
7条答案
按热度按时间yqhsw0fo1#
最简单的解决方案是允许类型推断工作,并且根本不指定任何类型,如果你需要指定一个类型,因为浏览器和节点声明的类型不一致,你可以使用
ReturnType
来指定变量的类型是setTimeout
的返回类型:或者,也可以使用
window.setTimeout
来代替setTimeout
,它返回正确的返回类型。3ks5zfa02#
可以使用
window.setTimeout
,它返回number
类型。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找到自定义类型定义,则其优先级高于默认类型定义。
解决方案:
"typeRoots":[]
"types": []
解决方法:
window.setTimeout()
bhmjp9jg4#
window.setTimeout
返回number
。理想情况下,您希望定义自己的类型以将其与number区分开来(并防止一些操作,如+
,这对计时器没有意义)。tjrkku2a5#
对于任何其他有这个错误的人,我的工作是在tsconfig.js文件中添加:
jc3wubiy6#
在我的例子中,我在Node中工作,所以我使用
NodeJS.Timeout
new9mtju7#
使用前缀窗口时的类型。
setTimeout初始化(您可以选择初始化为
null
)用法
清除