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

使用jest.mocked模拟selector factory时遇类型错误的解决求助

解决Reselect Selector Factory的TypeScript Mock类型错误

问题原因

makeSelectItemsByCategory返回的是Reselect的OutputSelector类型,它不只是一个接收state的函数,还附带了clearCache等专属方法。你当前mock的只是普通空函数,不符合TypeScript对OutputSelector类型的结构要求,因此抛出类型错误。

解决方案

方案1:模拟完整的OutputSelector结构

直接创建符合类型要求的对象,包含函数调用逻辑和必要属性:

it('does stuff', () => {
  // 构造符合OutputSelector类型的模拟对象
  const mockSelector = Object.assign(
    () => [], // 核心逻辑:返回空数组
    { clearCache: jest.fn() } // 补充OutputSelector要求的属性
  );

  jest.mocked(makeSelectItemsByCategory).mockReturnValueOnce(mockSelector);
  // 后续测试逻辑...
});

方案2:使用类型断言跳过类型检查

如果不需要模拟clearCache等方法,可用类型断言告知TypeScript忽略类型差异:

it('does stuff', () => {
  jest.mocked(makeSelectItemsByCategory).mockReturnValueOnce(
    (() => []) as unknown as ReturnType<typeof makeSelectItemsByCategory>
  );
  // 后续测试逻辑...
});

ReturnType<typeof makeSelectItemsByCategory>会自动推导原函数的返回类型,确保断言的准确性。

方案3:用Reselect创建真实Selector来Mock

如果希望mock的selector行为更贴近真实场景,可直接用createSelector生成匹配类型的selector:

import { createSelector } from '@reduxjs/toolkit'; // 或直接引入reselect库

it('does stuff', () => {
  // 创建返回空数组的真实selector
  const mockSelector = createSelector(
    () => [],
    () => []
  );

  jest.mocked(makeSelectItemsByCategory).mockReturnValueOnce(mockSelector);
  // 后续测试逻辑...
});

这种方式完全匹配原selector的类型,不会触发类型错误,同时保留了Reselect selector的所有属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:42:39