You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:35:24