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

TypeScript React中如何为useRef创建的对象引用定义正确类型

TypeScript中为存储普通对象的useRef添加类型标注

正确写法

直接将自定义类型作为泛型参数传入useRef调用,不需要额外手动标注变量类型,TS会自动推导ref的正确类型:

import { useRef } from 'react'

interface Range {
  low: number
  high: number
  min: number
  max: number
}

const inPropsRef = useRef<Range>({low: 10, high: 80, min: 0, max: 100})

// 访问、修改属性均不会触发类型错误
console.log(inPropsRef.current.low) // 类型推导为number
inPropsRef.current.high = 85

如果有特殊场景需要手动标注ref变量的类型,需要使用MutableRefObject类型,这是React为存储可变普通值的ref设计的类型:

import { useRef } from 'react'
import type { MutableRefObject } from 'react'

interface Range {
  low: number
  high: number
  min: number
  max: number
}

const inPropsRef: MutableRefObject<Range> = useRef<Range>({low: 10, high: 80, min: 0, max: 100})

之前写法的错误原因

  • 标注为RefObject<Range>/Ref<Range>:这两个类型是为DOM节点、类组件引用设计的,类型定义中current为只读属性,且类型为Range | null,直接访问current.low时TS会判定你可能在null值上读取属性,因此抛出low属性不存在的错误。
  • 标注为Range:useRef的返回值永远是带current字段的引用包装对象,不是存入的原始值本身,Range类型上不存在current字段,必然触发类型错误。

注意:不要混淆两种useRef的使用场景:存DOM/组件实例时初始值传null,泛型对应实例类型,返回的ref.current是T | null;存普通可变值时传入匹配的初始值,泛型对应值的类型,返回的ref.current是可读写的T类型。

内容的提问来源于stack exchange,提问作者jc28

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:21:20