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

TypeScript React Framer项目自定义useInterval钩子类型报错如何解决?

TypeScript错误修复方案

错误根因

两个报错均来自自定义useInterval钩子的类型定义不完整:

  • 报错①:useRef初始化未指定类型,TypeScript默认推导其current属性类型为undefined,无法接收传入的回调函数
  • 报错②:savedCallback.current被判定为可能为undefined,不允许直接调用
    另外你定义的Counter组件Props接口所有属性为必填,调用时仅传2个参数也会触发类型错误,需要同步调整。

修复代码

调整后完整的Counter组件代码

import { useEffect, useRef, useState } from 'react';

// 将属性改为可选,匹配你设置的默认值
interface Props {
  valueFrom?: number;
  valueTo?: number;
  totalDuration?: number;
}

export const Counter: React.FunctionComponent<Props> = ({ valueFrom = 0, valueTo = 100, totalDuration = 1 }) => {
  const [count, setCount] = useState(valueFrom);

  useInterval(() => {
    if (count < valueTo) {
      setCount(count + 1);
    }
  }, (totalDuration / valueTo) * 1000);

  // 补充:React组件不能直接返回数字,需要包裹在标签里,否则会触发运行时错误
  return <>{count}</>;
};

const useInterval = (callback: () => void, delay: number) => {
  // 给ref指定回调函数类型,解决报错①
  const savedCallback = useRef<() => void>();

  // 存储最新回调
  useEffect(() => {
    savedCallback.current = callback;
  }, [callback]);

  // 启动定时器
  useEffect(() => {
    function tick() {
      // 用可选链调用,避免undefined报错,解决报错②
      savedCallback.current?.();
    }
    if (delay !== null && delay !== undefined) {
      const id = setInterval(tick, delay);
      return () => clearInterval(id);
    }
  }, [delay]);
};

调用代码无需调整

export const Index: React.FunctionComponent = () => {
  return (
   <Counter valueTo={30} totalDuration={2 + 0.5} />
  );
};

补充说明

  • 可选链?.会在current为undefined时自动终止执行,符合定时器的运行逻辑,无需额外的非空断言
  • delay判断新增了undefined校验,避免delay为异常值时启动无效定时器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 18:15:07