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

如何修复React TypeScript中useHotkeys返回ref与div ref属性类型不匹配的错误

解决方案

方案1:给自定义钩子添加泛型(推荐,类型安全可复用)

useHotkeys本身支持传入绑定元素的类型泛型,你可以把自定义的useKeyboardFormSubmit改造成支持泛型的版本,既可以解决当前的类型冲突问题,后续也可以灵活绑定到form、section等其他元素上:

import { useHotkeys, Options } from 'react-hotkeys-hook';
import type { MutableRefObject } from 'react';

// 泛型T默认设为HTMLDivElement,适配当前div绑定场景
export const useKeyboardFormSubmit = <T extends Element = HTMLDivElement>(
  callback: () => void,
  deps: any[] = [],
): MutableRefObject<T | null> => {
  const hotKeyOptions: Options = {
    enableOnTags: ['INPUT', 'TEXTAREA', 'SELECT'],
  };
  // 给useHotkeys传入泛型T,指定返回ref的元素类型
  const ref = useHotkeys<T>(
    'ctrl+enter, cmd+enter',
    () => {
      callback();
    },
    hotKeyOptions,
    deps,
  );
  return ref;
};

修改完成后在组件中直接调用即可,不需要额外做类型断言,类型校验会自动通过,快捷键功能也不会受影响。

方案2:针对性类型断言(应急可用)

如果你不想修改自定义钩子的代码,不要直接断言为LegacyRef<HTMLDivElement>,之前的断言方式会丢失ref的引用指向导致快捷键失效,需要保持原ref的结构做类型断言:

import type { MutableRefObject } from 'react';

const ref = useKeyboardFormSubmit(() => {
  console.log('contact got keystrokes');
  handleSubmit(onSubmit)();
}) as MutableRefObject<HTMLDivElement | null>;

修改后类型校验会通过,快捷键功能也可以正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:36:03