打字稿错误:setInterval - 类型“计时器”不可分配给类型“数字”

Ric*_*cha 13 javascript typescript angular

我有以下代码:

let onSizeChangeSetInterval = setInterval(() => {...}, 30);
Run Code Online (Sandbox Code Playgroud)

当我编译此代码时,出现以下错误:

src/components/popover/popover.component.ts(98,17) 中的错误:错误 TS2322:“定时器”类型不可分配给“数字”类型。src/modules/forms-ui/formly/types/daterange/picker.daterange.component.ts(186,9): 错误 TS2322: 类型 'Timer' 不可分配给类型 'number'。

小智 40

使用ReturnType

let onSizeChangeSetInterval: ReturnType<typeof setInterval> | undefined;
onSizeChangeSetInterval = setInterval(() => {...}, 30);
Run Code Online (Sandbox Code Playgroud)


小智 19

使用window.setInterval替代

  • 尝试在服务器端构建应用程序时,访问“窗口”将会中断。 (8认同)
  • 对于那些可能不知道的人来说,普通的“旧的 setInterval” 似乎返回“NodeJS.Timeout”(根据代码检查),但“window.setInterval”返回“number”。 (5认同)
  • @Jyothu首先检查窗口是否存在:`if (typeof window !== 'undefined'){}` (2认同)

anv*_*nvk 5

通过查看error TS2322它看起来像是 TypeScript 错误而不是 JavaScript 错误。基本上,您正在尝试将类型编号变量转换为计时器变量。

你能代替吗?

let onSizeChangeSetInterval:NodeJS.Timer;
onSizeChangeSetInterval = setInterval(() => {...}, 30);
Run Code Online (Sandbox Code Playgroud)

取自

http://evanshortiss.com/development/nodejs/typescript/2016/11/16/timers-in-typescript.html

  • TypeScript 编译器无法区分 setInterval 与“@types/node”或“lib.dom.ts”,请使用“window.setInterval”来消除歧义,浏览器中的返回类型应为“number”。 (5认同)
  • 我猜他可以。但我强烈建议使用 ES6 `let` 或 `const` 并避免使用 `var`。Var 不是块作用域,所以我建议停止使用它并完全切换到前两种类型的变量。拥抱更新的 JavaScript (ES6) (https://hackernoon.com/js-var-let-or-const-67e51dbb716f) (2认同)