Typescript: setTimeout-将超时ID分配给变量会引发错误TS2323:类型“ Timer”不可分配给类型“ number”。

创建于 2014-10-07  ·  24评论  ·  资料来源: microsoft/TypeScript

使用tsc v1.1.0-1编译时会出现错误:
错误TS2323:无法将“计时器”类型分配给“数字”类型。

以下代码引发编译错误:

this.sTimeout = setTimeout(()=> this.showDelay(),250);

sTimeout定义为数字(私有var)。

Question

最有用的评论

只需使用window.setTimeout

所有24条评论

请发布完整的示例。 到目前为止提供的信息不足以重现此问题:

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也可以是旨在用于浏览器和节点的同构代码。

对于使用setTimeoutsetInterval进入此处的其他用户,请使用window.setTimeoutinterval以便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 :

此页面是否有帮助?
0 / 5 - 0 等级