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

React中useRef报错‘() => void无法赋值给undefined’的原因?

解决useRef赋值函数时的TypeScript类型错误

报错缘由

这个错误是TypeScript的类型校验机制导致的:

  • 当你用const unMount = useRef();声明ref时,没有指定泛型类型,TypeScript会根据初始值(这里是undefined)自动推断unMount.current的类型为undefined。
  • 后续你给unMount.current赋值了一个() => void类型的函数,两种类型不兼容,因此抛出Type '() => void' is not assignable to type 'undefined'的错误。

解决方案

有两种简单的方式修复这个类型问题:

1. 显式指定useRef的泛型类型

直接在声明useRef时,明确它的current属性可以是无返回值函数或者undefined:

const [counter, setCounter] = useState(5);
// 指定泛型类型,允许current为函数或undefined
const unMount = useRef<(() => void) | undefined>();

unMount.current = () => {
  console.log(`The counter is: ${counter}`);
};

useEffect(() => {
  return () => {
    if (unMount.current)
      unMount.current();
  };
}, [])

2. 给useRef设置null初始值并指定泛型

也可以给useRef一个null初始值,同时指定泛型类型,后续赋值函数时就不会触发类型错误:

const [counter, setCounter] = useState(5);
// 指定泛型类型,初始值设为null
const unMount = useRef<(() => void) | null>(null);

unMount.current = () => {
  console.log(`The counter is: ${counter}`);
};

useEffect(() => {
  return () => {
    if (unMount.current)
      unMount.current();
  };
}, [])

额外说明

你当前的逻辑是可行的:每次组件渲染时,都会更新unMount.current指向最新的函数,这个函数会捕获当前渲染周期的counter值。当组件卸载时,执行的是最后一次渲染时赋值的函数,能拿到最新的counter值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:00:18