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

React+Typescript编写绑定div的自定义useHover hook报ts(1005)错求解

问题原因

你的报错来自于TypeScript泛型定义的语法错误:函数表达式的泛型参数不能直接声明在变量类型标注的位置(即冒号之后),且你错误地将具体类型HTMLDivElement当作了泛型参数名使用,不符合TS语法规范,因此触发'(' expected.ts(1005)错误。
另外你的代码还有两个隐含问题:

  • 只监听了mouseover事件,没有监听mouseout事件,hover状态不会自动恢复
  • 未指定返回数组的类型,TypeScript会默认将其推断为联合类型数组,解构使用时会出现类型不匹配问题

修复后的完整代码

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

const Hooks = (props: any) => {
    const [hoverRef, hovered] = useHover<HTMLDivElement>();
    const style = {
        backgroundColor: hovered ? "red" : "",
    };

    return (
        <div ref={hoverRef} style={style}>
            <h1>Hooks!</h1>
        </div>
    );
};

// 修复泛型语法,支持任意继承自HTMLElement的元素类型
const useHover = <T extends HTMLElement>() => {
    const [value, setValue] = useState(false);
    const ref = useRef<T>(null);

    const handleMouseOver = () => setValue(true);
    // 补充鼠标移出事件处理
    const handleMouseOut = () => setValue(false);

    useEffect(() => {
        const node = ref.current;
        if (node) {
            node.addEventListener("mouseover", handleMouseOver);
            node.addEventListener("mouseout", handleMouseOut);

            return () => {
                node.removeEventListener("mouseover", handleMouseOver);
                node.removeEventListener("mouseout", handleMouseOut);
            }
        }
    }, []);

    // 添加as const将返回值标记为元组类型,避免类型推断错误
    return [ref, value] as const;
};

简化版本(固定仅支持div元素,无需泛型)

const useHover = () => {
    const [value, setValue] = useState(false);
    const ref = useRef<HTMLDivElement>(null);

    const handleMouseOver = () => setValue(true);
    const handleMouseOut = () => setValue(false);

    useEffect(() => {
        const node = ref.current;
        if (node) {
            node.addEventListener("mouseover", handleMouseOver);
            node.addEventListener("mouseout", handleMouseOut);
            return () => {
                node.removeEventListener("mouseover", handleMouseOver);
                node.removeEventListener("mouseout", handleMouseOut);
            }
        }
    }, []);

    return [ref, value] as const;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:27:02