应该在typescript中定义什么类型的超时

bis0qfac  于 2023-02-10  发布在  TypeScript
关注(0)|答案(4)|浏览(174)

我尝试用typescript编写一个去抖动函数,但是不确定用什么类型来设置一个赋值给setTimeout的变量。

function debounced(func: () => void, wait: number) {
    // what type should timeout be here?
    let timeout: any;
    return () => {
        if (timeout) {
            clearTimeout(timeout);
        }
        timeout = setTimeout(() => {
            func();
        }, wait);
    };
}
ocebsuys

ocebsuys1#

如果你想让你的代码在node.js和浏览器环境之间可移植,你可以像这样使用setTimeout的返回类型:

let timeout: ReturnType<typeof setTimeout>;

因为它在节点和浏览器中声明为返回不同的类型。

f4t66c6m

f4t66c6m2#

Typescript将自定义类型定义的优先级设置为高于默认类型。
如果您的tsconfig.json文件包含types: node,它将告诉Typescript使用在node_modules/@types/node中找到的setTimeout(): NodeJS.Timeout,而不是默认的setTimeout(): number方法。

"compilerOptions": {
    "types": [
      "node",
      ...
    ]
}

如果你并不需要这个类型选项,删除它,这个错误就会消失:

"compilerOptions": {
}
bxgwgixi

bxgwgixi3#

如果您只是使用浏览器,显式调用window.setTimeout应该可以解决这个问题。

8ftvxx2r

8ftvxx2r4#

您可以尝试使用window.setTimeout,而不仅仅是setTimeout,这样就可以显式地使用类型脚本

相关问题