TypeScript外围常量条件判断为何出现编译错误
编译错误核心原因
这个报错是两个问题叠加导致的:
1. TypeScript 类型收窄的边界限制
TS 的类型收窄是编译阶段的静态语法分析,仅能识别同作用域内的内置类型守卫逻辑,不会跨函数边界推导外部工具函数的判断语义:
- 原生等值判断
a === null属于TS内置支持的类型守卫,在同一个函数作用域内,TS能直接识别判断逻辑:如果条件成立就提前return,后续代码块会自动把变量类型从联合类型中排除null,完成类型收窄。 - 外部导入的
lodash.isNull是第三方封装的工具函数,默认情况下TS不会把它识别为类型守卫,无法感知「函数返回true就代表入参是null」的逻辑,自然不会触发后续的类型收窄。
2. 代码存在参数传递的逻辑错误
你传给isNull的参数是scrollViewRef本身,但useRef<ScrollView | null>(null)返回的是React维护的固定ref对象,类型为MutableRefObject<ScrollView | null>,这个对象本身永远不会是null,真正可能为null的是它挂载实例的current属性。
如果你的项目中lodash的类型声明给isNull标注了类型谓词(value: unknown) => value is null,TS会静态检测到你传入的ref对象类型和null完全没有交集,这个判断永远不可能成立,属于无效的冗余判断,就会直接抛出编译错误。
而你写的scrollViewRef === null没有触发编译报错,本质是TS对原生等值判断的冗余检测更宽松,不会直接阻断编译,但这行判断永远返回false,完全起不到判空效果。
正确修复写法
判空时必须判断ref的current属性,直接用原生等值判断即可,TS可以正常识别并完成类型收窄:
import { useRef, useCallback } from 'react'; import { ScrollView } from 'react-native'; const scrollViewRef = useRef<ScrollView | null>(null); const onPressFooter = useCallback(() => { // 正确判断current属性,TS可正常收窄类型 if (scrollViewRef.current === null) return; // 此时current类型被收窄为ScrollView,可正常调用方法 scrollViewRef.current.scrollTo({ y: 0, animated: true }); }, []);
如果一定要使用lodash的isNull方法,需要手动给方法补充类型谓词声明,但是原生判断更简洁无额外依赖,更推荐使用。
内容的提问来源于stack exchange,提问作者Hal-ang
相关产品推荐
相关产品推荐

