使用tsc v1.1.0-1编译时会出现错误:
错误TS2323:无法将“计时器”类型分配给“数字”类型。
以下代码引发编译错误:
this.sTimeout = setTimeout(()=> this.showDelay(),250);
sTimeout定义为数字(私有var)。
请发布完整的示例。 到目前为止提供的信息不足以重现此问题:
class Foo {
private sTimeout: number;
showDelay() { }
bar() {
setTimeout(() => this.showDelay(), 250);
}
}
没有称为Timer
内置类型,因此您所调用的setTimeout
可能不是window.setTimeout
。
应该做出榜样-早些时候就匆忙了。 干得好:
class Foo {
private sTimeout: number; // Storing Timeout ID - to clear it - if needed
private showDelay() { }
constructor() {
this.sTimeout = setTimeout(() => this.showDelay(), 250);
}
}
引发以下错误:
使用TSC v1.1.0-1
/tests/Foo.ts(5,3):错误TS2323:类型“计时器”不可分配给类型“数字”。
现在,我通过将sTimeout键入any来修复它。
这对我来说不是正确的。 当您F12 setTimeout
会发生什么?
不确定F12是什么意思? 。
“转到定义”
同样,没有称为Timer
内置类型,因此您的代码必须引用其他类型。 请单独尝试一个文件中的示例,或者弄清楚该Timer
来自项目的哪个位置。 我猜测setTimeout
不是指内置函数,而是其他一些具有不同返回值的用户定义函数。
单独尝试了该示例:看起来它是由我的工具链中的组件或其他代码引起的-抱歉花时间。 谢谢...关闭...
对于未来的读者,由于遇到了node.js绝对类型化的定义,我遇到了此错误。 解决方案是使用类型的全名,即NodeJS.Timer
而不是Timer
(可悲的是Typescript编译器建议,但不起作用)。
@jdfreder时光飞逝-未来就在这里
无论如何,我遇到了同样的问题: error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other.
即使我在文件顶部定义了隐式引用/// <reference path="node_modules/typescript/lib/lib.d.ts" />
仍然不起作用。
主要问题是我们的第三方npm软件包(angular2)中的一个包含TS +类型(节点和其他)。
@rixrix (以及其他发现此问题的人)在遇到类似问题之前,直到意识到自己没有传递正确的参数。
比较一下,这需要第二个参数ms
并返回NodeJS.Timer
:
function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;
...,这确实使第二个参数timeout
可选参数并返回number
:
function setTimeout(handler: any, timeout?: any, ...args: any[]): number;
根据这两个函数,TS会正确选择适当的重载,因此,如果获得error TS2352: Neither type 'Timer' nor type 'number' is assignable to the other
确保指定了超时!
嗨@Penryn感谢您的注意!
我认为我先前的评论证明没有提供足够的详细信息,因为我已经不记得有关该错误消息的确切详细信息了。 抱歉。
在我的头上,我们以前遇到的问题是当我们对以Angular2(alpha版本)编写的衍生Web应用程序进行增量升级时。 我们的主要代码库(ng1和ng2)是用TypeScript编写的(带有Bower组件,许多其他类型的输入和少量自定义类型),而当时Angular2也在交付类型,节点类型等。使用我们的节点类型(过时的)版本)和ng2节点类型(以及可能的其他类型),实际上TS编译器对dups类型感到困惑。 在我们的情况下,我们可以手动修改有问题的类型,但是要知道我们必须提取最新版本会有些麻烦
我认为这已在最近的Angular2版本中解决,因为我们必须手动安装所需的类型。
干杯
@RyanCavanaugh有同样的问题。 我看,我对setTimeout有两个定义。 一个返回number
,另一个返回NodeJS.Timer
。
只需使用window.setTimeout
。
为什么NodeJS.Timer
需要特殊类型? 它仍然只会返回number
对吗? 我想念什么吗?
@cchamberlain节点实际上返回了整个Timer类: https : //nodejs.org/api/timers.html
因此,在这种情况下,不仅是number
。
@Penryn -TIL👍
对于那些好奇的人,发生这种情况的原因是,node.js中的setTimeout
返回的内容与浏览器中的setTimeout
。 浏览器的setTimeout只返回一个数字; 在node.js中,setTimeout返回一个较大的Timer对象。
因此,看到此问题的原因几乎可以肯定是因为您打算针对Web,但是已经引入了节点定义。
@johnfn也可以是旨在用于浏览器和节点的同构代码。
对于使用setTimeout
或setInterval
进入此处的其他用户,请使用window.setTimeout
或interval
以便tsc知道您正在使用网络浏览器的功能(返回数字),而不是NodeJS的函数(返回其他函数)。
要添加到@AskYous上,如果软件包中有@types/node
,请使用window.setInterval
以避免类型失败。
对于谁将@angular
与@angular-cli
使用,请确保在tsconfig.app.json
上也具有类型节点。
式:
tsconfig.app.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"module": "es6",
"baseUrl": "",
"types": ["node"] --> ADD THIS
},
"exclude": [
"test.ts",
"**/*.spec.ts"
]
}
我在这里找到了它: https :
也许您导入了一个包,其名称setTimeout()
。
只需使用window.setTimeout
而不是setTimeout
即可解决问题:)
节点环境中的类型为NodeJS.Timer
使用global.setTimeout
在浏览器环境中,类型为number
使用window.setTimeout
安装npm i @types/react @types/react-dom --save-dev
后的今天
@types\node
泄漏到node_modules
,因此导致Timer
错误
就像@ nippur72一样,我今天遇到react-dom
。 我认为最简单的解决方案是在预期浏览器环境时更新@types
软件包以不依赖于Node,因此: https :
最有用的评论
只需使用
window.setTimeout
。