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

TypeScript 5.3.3中Immutable对象Reducer报ts(2345)错误求助

解决TypeScript中Immutable.js Reducer的ts(2345)及类型不匹配错误

问题根源

你的核心问题是混淆了普通JS对象类型和Immutable.js的Map类型:

  • Immutable.fromJS()会把传入的普通对象转换成Immutable.Map实例,而非你定义的State接口对应的普通对象。
  • 第一个版本中TypeScript对fromJS的返回类型推断出错,导致set方法的参数类型识别混乱;第二个版本里你强行把Map赋值给普通对象类型,自然触发类型不匹配错误。

修正方案

1. 正确定义Immutable状态类型

用Immutable.Map指定状态的键值类型,替代普通对象接口:

import Immutable from 'immutable';

// 定义Immutable Map类型,明确键和对应值的类型
type AppState = Immutable.Map<'isLoading', boolean>;

2. 初始化状态并指定正确类型

给initialState指定AppState类型,让TypeScript正确识别它是Immutable Map:

const initialState: AppState = Immutable.fromJS({
  isLoading: false,
}) as AppState;
// 用类型断言as AppState修正fromJS的默认推断偏差,确保类型准确

3. 修正Reducer的类型定义

给reducer的参数和返回值都指定AppState类型,同时给action添加基础类型避免隐式any:

// 定义action的联合类型,覆盖所有可能的action类型
type AppAction = { type: 'LOAD' } | { type: 'OTHER_ACTION' };

const myReducer = (state: AppState = initialState, action: AppAction): AppState => {
  switch (action.type) {
    case 'LOAD':
      // 现在set方法的类型被正确识别,boolean值可正常传入
      return state.set('isLoading', false);
    default:
      return state;
  }
};

关于其他文件能正常运行的可能原因

  • 那些文件的TypeScript严格模式(strict: false)未开启,隐式any和类型不匹配的错误被忽略;
  • 其他文件可能使用了Immutable.Record而非fromJS,Record的类型推断更友好;
  • 其他文件的状态结构更简单,TypeScript的自动推断刚好正确识别了类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:46:24