如何在Vitest中Mock TypeScript接口以测试库类型逻辑
仅在测试环境Mock TypeScript接口的最优方案
你可以利用TypeScript的模块扩展特性,在测试环境单独扩展接口,无需重复定义依赖类型,也不会影响生产代码,具体实现如下:
方案一:测试目录专属类型声明文件
- 在测试目录(如
tests/)下创建mock-my-interface.d.ts文件,根据你的导入路径编写扩展:
// 若测试中通过相对路径导入MyInterface declare module './MyInterface' { interface MyInterface { testProp1: string; testProp2: number; // 按需添加测试所需的键值对类型 } } // 若测试中通过包名导入(如import { MyInterface } from 'my-lib/MyInterface') declare module 'my-lib/MyInterface' { interface MyInterface { testProp1: string; testProp2: number; } }
- 确保TypeScript识别测试目录的类型文件:
检查tsconfig.test.json(或主tsconfig.json)的include字段,包含测试目录:
{ "include": ["src/**/*", "tests/**/*"] }
Vitest默认会识别测试目录下的类型文件,一般无需额外配置。
- 在测试文件中直接复用原有类型:
import { MyInterface } from './MyInterface'; import type { TypeThatUseMyInterface } from './types'; // 此时TypeThatUseMyInterface会自动包含测试扩展的键 type TestCase = TypeThatUseMyInterface<'testProp1'>; // 类型为'testProp1',符合测试预期
方案二:单个测试文件临时扩展
如果仅需在某一个测试文件中扩展接口,可直接在文件顶部添加模块声明:
// 测试文件顶部 declare module './MyInterface' { interface MyInterface { tempTestProp: boolean; } } import { MyInterface } from './MyInterface'; // 后续代码可直接使用该临时扩展的类型
方案优势
- 无需重复定义依赖
MyInterface的业务类型,直接复用原有代码 - 测试环境的扩展完全隔离,不会混入生产包
- 基于TypeScript原生模块扩展机制,无需额外工具或复杂配置
内容的提问来源于stack exchange,提问作者zedryas
相关产品推荐
相关产品推荐

