React+TypeScript出现Property 'users' does not exist on type 'never'报错求助
报错原因
这个报错核心是 TypeScript 把你从 useAppSelector 拿到的 currVote 变量推导成了 never 类型,never 类型不允许访问任何属性,所以才会抛出找不到 users 属性的错误,和你写的运行时判断逻辑无关。
导致类型推导成 never 通常是以下几个原因:
- 你定义的
IVote接口没有声明users字段,或者字段类型定义错误 - 你编写 Redux slice 时没有给状态明确标注类型,TypeScript 只从初始值
null错误推导了状态类型,甚至因为 reducer 逻辑的问题把状态类型收窄成了never RootState或者useAppSelector的类型定义错误,没有正确关联你的 Redux store 结构
解决步骤
- 首先确认
IVote接口定义正确,包含符合要求的users字段:
interface IUser { name: string // 其他用户相关字段 } interface IVote { users: IUser[] // 其他投票相关字段 }
- 检查 Redux slice 的定义,给状态明确标注类型,避免 TypeScript 错误推导:
import { createSlice, PayloadAction } from '@reduxjs/toolkit' const initialState: IVote | null = null const voteSlice = createSlice({ name: 'vote', // 这里明确标注 state 类型,避免 TypeScript 只从 null 推导类型 initialState: initialState as IVote | null, reducers: { setVoteData: (state, action: PayloadAction<IVote>) => { return action.payload } } })
- 确认 Store 配置文件中正确导出了
RootState类型:
// store.ts import { configureStore } from '@reduxjs/toolkit' import voteReducer from './voteSlice' export const store = configureStore({ reducer: { vote: voteReducer } }) export type RootState = ReturnType<typeof store.getState> export type AppDispatch = typeof store.dispatch
- 确认自定义 Hook
useAppSelector是基于RootState定义的:
// hooks.ts import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux' import type { RootState, AppDispatch } from './store' export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector export const useAppDispatch = () => useDispatch<AppDispatch>()
完成以上配置后,你原来的组件代码不需要做任何修改,TypeScript 就能正确识别 if(currVote) 分支里的 currVote 是 IVote 类型,可以正常访问 users 字段遍历渲染。
为什么你之前的尝试没有生效
- 把初始值改成
any没用:因为RootState中vote字段的类型已经被 TypeScript 错误推导为never,初始值的类型标注优先级低于 slice 和 store 的全局类型推导 - 加非空断言、可选链没用:
never类型属于 TypeScript 的底层类型,任何对never类型的属性访问都会直接报错,和运行时的存在性判断无关
内容的提问来源于stack exchange,提问作者Eldar Tailov
相关产品推荐
相关产品推荐

