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
相关产品推荐
相关产品推荐

