我正在升级一些旧的TypeScript代码,以使用最新的编译器版本,但我在调用setTimeout时遇到了问题.代码将调用浏览器的setTimeout函数,该函数返回一个数字:

setTimeout(handler: (...args: any[]) => void, timeout: number): number;

然而,编译器正在将其解析为 node 实现,它返回一个NodeJS.计时器:

setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;

此代码不在 node 中运行,但 node 类型作为对其他内容的依赖(不确定是什么)被拉入.

我如何指示编译器 Select 我想要的setTimeout版本?

以下是相关代码:

let n: number;
n = setTimeout(function () { /* snip */  }, 500);

这会产生编译器错误:

TS2322: Type 'Timer' is not assignable to type 'number'.

推荐答案

2021 update

Akxe's answer表示Typescript 2.3中引入的ReturnType<Type>技术:

let n: ReturnType<typeof setTimeout>;
n = setTimeout(cb, 500);

它很好,似乎比显式的演员更受欢迎.但在本例中,"n"的结果类型是"NodeJS.Timeout",可以按如下方式使用:

let n: NodeJS.Timeout;
n = setTimeout(cb, 500);

ReturnType/NodeJS的唯一问题是.超时方法是,特定于浏览器的环境中的数字操作仍然需要强制转换:

if ((n as unknown as number) % 2 === 0) {
  clearTimeout(n);
}

Original answer

不影响变量声明的变通方法:

let n: number;
n = setTimeout(function () { /* snip */  }, 500) as unknown as number;

此外,在特定于浏览器的环境中,可以使用window对象,而无需强制转换:

let n: number;
n = window.setTimeout(function () { /* snip */  }, 500);

Typescript相关问答推荐

如何将http上下文附加到angular中翻译模块发送的请求

根据另一个成员推断类成员的类型

处理API响应中的日期对象

参数类型undefined不能分配给参数类型字符串|未定义

如何在使用`Next—intl`和`next/link`时导航

rxjs forkJoin在错误后不会停止后续请求

如何使用函数填充对象?

不推荐使用Marker类-Google map API警告

如何按不能保证的功能过滤按键?

使用订阅时更新AG网格中的行

MatTool提示在角垫工作台中不起作用

TypeScrip:从对象中提取和处理特定类型的键

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

如何创建内部和外部组件都作为props 传入的包装器组件?

如何在TypeScrip中使用数组作为字符串的封闭列表?

如何调整项目数组,但允许权重影响顺序

JSX.Element';不可分配给类型';ReactNode';React功能HOC

断言同级为true或抛出错误的Typescript函数

为什么 Typescript 无法正确推断数组元素的类型?

使用react+ts通过props传递数据