如何以类型安全的方式替换 setTimeout 方法?

问题描述 投票:0回答:1

在我的测试中,我想替换 setTimeout 方法,以便测试运行得更快。

最初我有一段使用“any”的等效代码...但是当然 eslint 等 bleats。

我现在有了这段代码,但最后却没有任何内容。

  let defaultTimeout: typeof globalThis.setTimeout;
  beforeEach(() => {
    defaultTimeout = global.setTimeout;
    globalThis.setTimeout = (callback: TimerHandler) => { (1)
      defaultTimeout(callback, 500);
    };
  })

但是,我在 globalThis.setTimeout 处仍然遇到错误

TS2741:类型中缺少属性promisify(回调: TimerHandler) => void 但在 typeof setTimeout 类型中是必需的 timers.d.ts(161, 19):在这里声明了promisify

我知道我可以通过使用任何和未知来解决这个问题......还有其他方法吗?

javascript typescript type-safety
1个回答
0
投票

覆盖

setTimeout
setInterval
console.*
等函数是不好的做法。你为什么要这样做?您考虑过使用计时器模拟吗?

我假设你使用 Jest 或 Vitest,无论如何逻辑是相同的。

如果您只想跳过计时器,您可以这样做

jest.useFakeTimers();

// Your test code goes here...

expect(true).toEqual(true);

jest.runAllTimers();

jest.useRealTimers();

jest.runAllTimers();
行就是执行此操作的那条线,“快进”计时器,请在此处阅读更多信息:https://jestjs.io/docs/jest-object#jestrunalltimers

© www.soinside.com 2019 - 2024. All rights reserved.