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

在TypeScript中能否实现排除jest.Mock<any, any, any>的类型约束?

解决Jest MockedService类型排除jest.Mock<any, any, any>的问题

你可以通过扩展MockedService类型,添加类型约束来排除未指定具体类型的jest.Mock<any, any, any>,强制开发者必须使用jest.mocked包裹以提供明确类型。

方案一:直接排除any类型的Mock

通过条件类型检查成员是否为jest.Mock<any, any, any>,若是则返回never触发类型错误:

type NotAnyMock<T> = T extends jest.Mock<any, any, any> ? never : T;

export type MockedService<T extends object> = {
  [K in keyof T]: NotAnyMock<jest.MaybeMockedDeep<T[K]>>;
};

方案二:强制使用明确类型的Mock

直接定义每个成员必须是对应函数类型的明确Mock,或非函数成员的深度Mock:

type StrictMock<T> = T extends (...args: infer A) => infer R 
  ? jest.Mock<R, A> 
  : jest.MaybeMockedDeep<T>;

export type MockedService<T extends object> = {
  [K in keyof T]: StrictMock<T[K]>;
};

效果说明

  • 方案一中,若开发者直接使用jest.fn()(未指定类型),得到的jest.Mock<any, any, any>会被映射为never,导致类型报错,必须改用jest.mocked<目标类型>(jest.fn())来提供明确类型。
  • 方案二则从类型定义层面约束每个成员的Mock类型必须与原接口成员类型严格匹配,彻底避免any类型的Mock通过类型检查。

内容的提问来源于stack exchange,提问作者dwjohnston

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:13:09