如何在Vitest中为fs模块实现类型安全的Mock?
优化Vitest Mock fs模块的类型处理
直接用any规避类型错误会丢失类型检查能力,推荐以下两种更规范的优化方式:
方法一:使用Vitest内置的vi.mocked()工具函数
Vitest提供了专门的vi.mocked()工具,自动为mock后的模块/函数补充正确的mock类型,这是最简洁的方案:
import { promises as fs } from 'fs'; import { vi } from 'vitest'; vi.mock('fs'); it('can mock', async () => { // 用vi.mocked包裹后,自动获得mock函数的完整类型 vi.mocked(fs.readdir).mockResolvedValue([]); // 后续测试逻辑 });
方法二:手动断言为Mock类型
从vitest导入Mock类型,显式声明目标函数为mock类型,保留类型校验:
import { promises as fs } from 'fs'; import { vi, Mock } from 'vitest'; vi.mock('fs'); it('can mock', async () => { (fs.readdir as Mock).mockResolvedValue([]); // 后续测试逻辑 });
问题根源说明
vi.mock('fs')在运行时会把fs模块替换为mock版本,但TypeScript静态类型系统仍沿用原生fs.promises的类型定义——而原生类型里并没有mockResolvedValue这类mock方法。通过上述两种方式,能让TypeScript识别到这是一个Vitest mock函数,从而获得正确的类型提示和检查。
内容的提问来源于stack exchange,提问作者ajthinking
相关产品推荐
相关产品推荐

