TypeScript访问对象属性报'name不存在于never类型'错误如何解决
报错原因
TypeScript 抛出该错误的核心是类型推断链路出现了问题,即使你手动给user标注了IUser | null类型,依然存在优先级更高的错误类型定义:
- 你自定义的
useAppSelector没有正确绑定Redux全局状态的RootState类型,导致返回值类型推断失效 - 你的
RootState类型定义中user字段被错误定义为了never类型,TypeScript 认为user永远不可能为真,因此三元表达式中user为真的分支会被收窄为never类型,自然不存在name属性。
运行时可以正常打印是因为TypeScript类型检查仅在编译阶段生效,实际运行的JS代码没有类型限制。
解决方法
- 修正RootState类型定义,确保user字段关联正确的
IUser | null类型
// 你的Redux store定义文件 import { combineReducers } from '@reduxjs/toolkit' import userReducer from './userSlice' const rootReducer = combineReducers({ user: userReducer, // 确保userReducer的state初始值和类型匹配IUser | null }) export type RootState = ReturnType<typeof rootReducer>
- 确保
useAppSelector正确绑定RootState类型
// 你的自定义hooks文件 import { TypedUseSelectorHook, useSelector } from 'react-redux' import type { RootState } from './store' // 必须显式指定useAppSelector关联RootState,否则类型推断会失效 export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
- 临时绕过方案(不推荐,优先修正类型定义):使用类型断言强制指定类型
{ user ? <button className={style.header__button}> {(user as IUser).name} </button> : <button className={style.header__button} onClick={btn_click}> Reg </button> }
补充:你提供的代码中遗漏了FC、useState的导入,若实际代码中也未导入也需要补充对应导入语句。
内容的提问来源于stack exchange,提问作者Eldar Tailov
相关产品推荐
相关产品推荐

