在React forwardRef中,应优先用useRef还是createRef?(TypeScript场景)
关于React.forwardRef组件中useRef的TypeScript类型问题
问题本质
你碰到的类型报错,根源是useRef和createRef的类型默认行为差异:
createRef<typeof RNText>()返回的是RefObject<typeof RNText>类型,它的current属性默认值为null,刚好匹配forwardRef组件接收的Ref类型要求。- 而
useRef<typeof RNText>()在未传入初始值时,返回的是MutableRefObject<typeof RNText | undefined>——因为useRef默认初始值是undefined,这和组件期望的Ref类型不兼容,所以触发TypeScript报错。
规范解决方案(无需强制类型转换)
不要用强制类型断言,更安全的做法是给useRef传入初始值null,类型会自动匹配:
const textRef = useRef<typeof RNText>(null);
此时textRef的类型为MutableRefObject<typeof RNText | null>,完全符合forwardRef组件对ref属性的类型要求,无需额外类型处理。
关于强制类型转换的风险
你用as RefObject<typeof RNText>的方式虽然能通过编译,但本质是跳过了TypeScript的类型检查:
useRef的current初始值实际是undefined,但你断言成了RefObject(它的current只能是null或目标组件实例),这会隐藏潜在的空值风险——比如组件挂载前访问textRef.current时,实际值是undefined,但TypeScript会误判为null或RNText实例,可能引发运行时错误。
补充说明
函数式组件中确实推荐用useRef而非createRef,因为createRef每次渲染都会生成新的引用对象,而useRef会在组件整个生命周期内保持同一引用,更契合多数场景需求。只要正确初始化useRef的初始值为null,就能解决类型不兼容的问题。
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

