为何TypeScript在已判空的内部函数中仍提示gameInstance可能为null?
为什么TypeScript在内部函数中提示
gameInstanceContext.gameInstance可能为null? 你遇到的问题是TypeScript类型窄化的作用域限制导致的:
- 外层的
if (!gameInstanceContext.gameInstance) return确实能在当前同步代码块里把gameInstanceContext.gameInstance的类型窄化为TGameInstance,所以第3行的访问不会报错。 - 但内部函数
ft属于一个独立的函数作用域,TypeScript无法保证当ft执行时,gameInstanceContext.gameInstance的值没有被外部修改(比如组件重新渲染、上下文状态更新)——哪怕你在useEffect的依赖里加了这个值,TypeScript的类型检查不会关联依赖数组和内部函数的类型推断。因此它不会把外层的类型窄化结果带到内部函数中,依然会认为这个值可能是null | undefined。
解决办法
方法一:将值存入局部变量
把gameInstanceContext.gameInstance赋值给一个局部变量,这个变量在闭包里是稳定的,TypeScript能确定它的类型不会变化:
useEffect(() => { const gameInstance = gameInstanceContext.gameInstance if (!gameInstance) return console.log(gameInstance.players) // 无报错 const ft = () => { console.log(gameInstance.players) // 无报错 } ft() }, [gameInstanceContext.gameInstance])
方法二:在内部函数中再次判空
虽然有点冗余,但能直接解决类型提示问题:
useEffect(() => { if (!gameInstanceContext.gameInstance) return console.log(gameInstanceContext.gameInstance.players) // 无报错 const ft = () => { if (!gameInstanceContext.gameInstance) return console.log(gameInstanceContext.gameInstance.players) // 无报错 } ft() }, [gameInstanceContext.gameInstance])
内容的提问来源于stack exchange,提问作者papillon
相关产品推荐
相关产品推荐

