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

TypeScript Reducer单元测试报错:缺少RepairsPropertyLoadSuccessAction的payload

解决TypeScript Action类型不匹配错误

首先咱们拆解下这个报错:TypeScript明确告诉你,你传给reducer的action缺少payload属性,而RepairsPropertyLoadSuccessAction类型强制要求这个属性必须存在,所以当前的action不符合RepairsAction的类型约束,自然就报错了。

问题根源

你定义的RepairsPropertyLoadSuccessAction类型是这样的:

export type RepairsPropertyLoadSuccessAction = { type: typeof REPAIRS_PROPERTY_LOAD_SUCCESS; payload: RepairsProperty }

它要求这个action必须同时包含type和payload两个字段,但你在测试里只传了type,完全违反了这个类型规则,所以TypeScript直接拦下来了。

修复步骤

1. 给测试action补全合法的payload

你需要构造一个符合RepairsProperty类型的payload传入action。有两种简单方式:

  • 直接实例化RepairsProperty类
  • 用字面量模拟一个结构匹配的对象(TypeScript是结构类型系统,只要字段结构一致就认可)

修改后的测试代码如下:

it('should handle REPAIRS_PROPERTY_LOAD_SUCCESS', () => { 
  // 方式1:实例化RepairsProperty类
  const mockPayload = new RepairsProperty();
  // 方式2:用字面量模拟(更灵活,适合自定义测试数据)
  // const mockPayload = { models: [{ id: 'test-1', jobNo: 'RJ-001', trade: '水电', /* 其他字段按需填充 */ }] };

  const result = reducer(initialState, {
    type: 'repairs/PROPERTY_PAGE_LOAD_SUCCESS',
    payload: mockPayload
  })

  // 修正测试期望:原来的{}肯定会失败,要匹配reducer的实际输出逻辑
  expect(result).toEqual({
    ...initialState,
    isFetching: false,
    data: mockPayload.models
  }); 
})

2. 修正测试的期望结果

你原来写的expect(result).toEqual({})肯定会失败——你的reducer逻辑是返回{ ...state, isFetching: false, data: action.payload.models },所以必须把期望结果调整为匹配reducer实际输出的结构。

额外提示

如果以后测试不带payload的action(比如REPAIRS_PROPERTY_LOAD),那完全没问题,因为对应的RepairsPropertyLoadAction类型确实只要求type字段。但对于带payload的action类型,一定要严格遵守类型定义传全字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:43:11