TypeScript报错TS2532:已赋值的session仍提示可能未定义
问题情况
碰到了TS2532: Object is possibly 'undefined'.错误,报错位置是self.session。明明已经给self.session赋值了空对象,TypeScript还是认定它可能是undefined。试过用if语句检查self是否初始化,没用;暂时靠非空断言self.session!.ready = true顶过去,但这毕竟是临时办法,不是长久之计。当前用的TypeScript版本是4.2.4。
相关代码
业务代码
self.session = {} self.session.ready = true
类型定义
export const AuthStore = BaseMixin.named('AuthStore') .props({ session: types.maybe(SessionData) })
问题原因
核心问题在于TypeScript的类型推断没跟上——虽然同步给self.session赋了值,但因为session被定义成types.maybe(SessionData)(也就是类型是SessionData | undefined),加上MobX State Tree的类型封装特性,TS没识别到这次赋值已经把undefined的可能性排除了。
可行解决方案
给几个比非空断言更合理的解决办法:
加类型守卫缩小范围
直接检查self.session是否存在,虽然看起来有点多余,但能让TS正确识别类型:self.session = {} if (self.session) { self.session.ready = true }调整类型定义
如果业务里session肯定会被初始化,没必要保留可选状态,可以把types.maybe(SessionData)改成types.maybeNull(SessionData)(允许null而非undefined),或者直接用SessionData(完全排除空值),具体得看业务场景能不能这么改。用MST自带的类型检查方法
MobX State Tree提供了isStateTreeNode这类方法做类型守卫,比如:import { isStateTreeNode } from "mobx-state-tree" self.session = {} if (isStateTreeNode(self.session)) { self.session.ready = true }升级TypeScript版本
4.2.4版本比较老了,新版本(比如4.4及以上)在控制流分析和类型追踪上有优化,大概率能自动识别这种同步赋值后的类型变化,直接解决问题。
补充说明
更新:截图显示错误只标记在self.session上,不是同时标记对象和属性,符合TS对可选类型的错误提示逻辑。
内容的提问来源于stack exchange,提问作者Producdevity

