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

React TypeScript中HTML dialog的ref应使用什么正确类型

正确类型说明

替换useRef泛型位置any的正确类型为 HTMLDialogElement,该类型是TypeScript内置的DOM元素类型,完全匹配原生<dialog>标签的实例接口,包含showModal()、close()、open属性等所有dialog原生API的类型定义。使用该类型替代any后,TypeScript会自动校验你对dialog实例的属性、方法调用是否合法,提供完整的代码提示,避免调用不存在的API或者传参错误。

修正后的完整代码
import { useRef } from 'react'

const Modal: React.FC = () => {
  // 泛型参数替换为HTMLDialogElement,初始值保持null即可
  const modalRef = useRef<HTMLDialogElement>(null)
  
  function openModal() {
    // 增加可选链,避免组件未挂载时ref为null引发的运行时报错
    modalRef.current?.showModal()
  }

  function closeModal() {
    modalRef.current?.close()
  }

  return (
    <div>
      <button onClick={openModal}>Open</button>
      <dialog ref={modalRef}>
        <h1>Title</h1>
        <p>Info</p>
        <button onClick={closeModal}>Close</button>
      </dialog>
    </div>
  )
}

export default Modal
补充提示
  • 所有原生HTML元素对应的TypeScript类型遵循统一命名规则:HTML + 元素名大驼峰格式 + Element,比如div对应HTMLDivElement、按钮对应HTMLButtonElement、输入框对应HTMLInputElement,后续开发其他DOM元素的ref可以直接按这个规则匹配对应类型。
  • 原示例代码存在标签闭合笔误:<button/>是自闭合标签写法,button属于双标签元素,需要使用</button>闭合,最外层容器的<div/>也需要修正为</div>,上述代码已经同步修正了这部分语法问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:39:20