TS2345错误排查:懒加载Store选择器未返回缩小状态的问题
我来帮你梳理下这个问题的排查方向,这类Redux Toolkit懒加载场景下的类型错误,通常和选择器的定义逻辑、状态类型的关联方式有关:
检查选择器的创建方式
先确认getBpFailed是不是用createSelector正确创建的?正常工作的选择器之所以会被识别为MemorizedSelector,是因为它们遵循了「输入选择器缩小状态 + 结果选择器处理数据」的结构。如果这个出问题的选择器直接返回整个应用Store(比如写成(state: RootState) => state),或者跳过了输入选择器的状态缩小步骤,TypeScript就无法推导它的记忆化选择器类型,还会因为状态范围不匹配抛出TS2345错误。对比下其他正常选择器的代码结构,很容易发现差异。核对RootState的类型推导
懒加载切片的类型有没有正确合并到RootState里?建议RootState从Store实例自动推导,比如写成export type RootState = ReturnType<typeof store.getState>,而不是手动定义。如果手动定义的RootState漏掉了懒加载切片的类型,或者injectReducer时没有正确更新状态类型,就会导致选择器的输入状态类型和实际Store状态不兼容,进而触发类型错误。检查选择器的输入输出类型匹配
悬停查看getBpFailed的类型:如果它的类型只是普通的(state: XXX) => XXX而不是MemoizedSelector,说明它没有被createSelector正确包装。另外,组件中使用useSelector时,会自动传入RootState,如果这个选择器的定义期望的是某个切片状态而非整个RootState,就会出现参数类型不匹配的问题。反过来,如果选择器本该接收切片状态却被定义成接收整个RootState,也会引发错误。排查类型推断的冲突或导入错误
有没有手动给这个选择器指定了错误的类型?比如强行标注了和实际逻辑不符的返回值类型,干扰了TypeScript的自动推导。另外,检查选择器文件的导入路径:有没有误导入了旧的RootState类型,或者切片状态类型的路径写错了,导致类型关联失败。简化代码做测试验证
先把getBpFailed改成和其他正常选择器完全一致的结构试试:先写一个获取对应切片状态的输入选择器,再基于它创建记忆化选择器,比如:// 先定义输入选择器,缩小到目标切片 const selectBpSlice = (state: RootState) => state.bp; // 再创建记忆化选择器 export const getBpFailed = createSelector( [selectBpSlice], (bpSlice) => bpSlice.failed );如果修改后类型提示恢复正常、TS错误消失,就说明之前的选择器定义没有正确做状态缩小,导致类型推导失败。
内容的提问来源于stack exchange,提问作者tgrux

