我正在升级一些旧的TypeScript代码以使用最新的编译器版本,但在调用setTimeout
时遇到了问题。该代码期望调用浏览器的setTimeout
函数并返回一个数字:
setTimeout(handler: (...args: any[]) => void, timeout: number): number;
然而,编译器正在将其解析为Node实现,它返回一个NodeJS.Timer:
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;
此代码无法在节点中运行,但是节点typing被作为其他东西(不确定是什么)的依赖项引入。
我该如何指示编译器选择我想要的setTimeout
版本?
以下是相关的代码:
let n: number;
n = setTimeout(function () { /* snip */ }, 500);
这会产生编译错误:
TS2322:类型“计时器”无法分配给类型“数字”。
types
不包括node
,但是setTimeout
仍然获取其Node类型而不是浏览器类型。types
默认为node_modules/@types
中的所有类型,如https://www.typescriptlang.org/tsconfig#types所述,但即使您指定了`types`并且没有包含“node”,为什么`setTimeout`仍然获取其Node类型,以及如何获取浏览器类型?@Axke的解决方案有点像一个hack,基本上是说它返回什么就是什么。TypeScript可能仍然会找到错误的类型,但至少它将始终保持一致性错误。 - Denis Howe