You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vitest中Mock TypeScript接口以测试库类型逻辑

仅在测试环境Mock TypeScript接口的最优方案

你可以利用TypeScript的模块扩展特性,在测试环境单独扩展接口,无需重复定义依赖类型,也不会影响生产代码,具体实现如下:

方案一:测试目录专属类型声明文件

  1. 在测试目录(如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;
    }
}
  1. 确保TypeScript识别测试目录的类型文件:
    检查tsconfig.test.json(或主tsconfig.json)的include字段,包含测试目录:
{
    "include": ["src/**/*", "tests/**/*"]
}

Vitest默认会识别测试目录下的类型文件,一般无需额外配置。

  1. 在测试文件中直接复用原有类型:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:05:10