Typescript 和 React:使用解构的事件处理程序的正确类型是什么?

2024-04-27

当我在 React 中使用事件处理程序时,我遇到了 Typescript 严格性的问题。具体来说,我无法使用对象解构handleClick()进行的功能onClick={handleClick}属性。

这是不干净的版本,它是唯一一个打字稿没有抱怨地接受的版本:

const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
    const target: Element = event.target as Element
    // ...other code goes here
}

这是干净的版本,打字稿会抛出错误:

const handleClick = ({ target }: { target: Element }) => {
    // ...other code goes here
}

第二个代码块(不干净的版本)导致 Typescript 抛出错误。当我将鼠标悬停在 onClick={handleClick} 属性上时,会显示这个令人沮丧的神秘错误:

类型“({ target }: { target: Element; }) => void”不可分配给类型“MouseEventHandler”。 参数“__0”和“event”的类型不兼容。 类型“MouseEvent”不可分配给类型“{ target: Element; }'。 属性“目标”的类型不兼容。 类型“EventTarget”缺少类型“Element”中的以下属性:attributes、classList、className、clientHeight 和 120 more.ts(2322) index.d.ts(1457, 9):预期类型来自属性“onClick”,该属性在类型“DetailedHTMLProps”上声明

有人有解决办法吗?我很困惑。

先感谢您。


你可以只使用相同的类型React.MouseEvent<HTMLButtonElement>为解构参数。这将推断出正确的类型target。你可能想要使用currentTarget不过,这是处理程序附加到的元素,而不是target,这是事件发生的元素。对于按钮来说,它们是相同的,但 TypeScript 只能推断出实际的元素类型currentTarget.

import * as React from "react";

const handleClick = ({ target, currentTarget }: React.MouseEvent<HTMLButtonElement>) => {
    // target: EventTarget
    // currentTarget: EventTarget & HTMLButtonElement

    // ...other code goes here
}

const elt = <button onClick={handleClick} />

游乐场链接 https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAKjgQwM5wEoFNkGN4BmUEIcARFDvmQNwCwAUI7hAHarwAWyrAJgDZYAwv2C4A1nAC8cABQBvODGRQA5lhgAaOLgCuUSqxgAVFevgBfAFyYqMAHQBZCLtRYAogDcsRgDwAJY0cAGQAhXRgYNndBEB8YAD4ASmkEuHlGOCy4AHocpTMNGy940zUNTOy8nX1DE0KYYu8jMvM4ADI4QJDwyOjY+MZKrOr7MYgYTiwoHQheLDhVCCx0KcpGCyGGFnZ4LH54GV8AIwio1jg2ETFxKXluPkFriQtchMYgA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 和 React:使用解构的事件处理程序的正确类型是什么? 的相关文章

随机推荐

  • ANDROID NDK - android:找不到命令

    我试图完成 Android NDK 中提供的第一个示例练习 我试图在 cygwin 上运行以下命令 android update project p 然而 我得到android command not found error 我检查了我的
  • 套接字是否可以仅针对 recv() 函数设为非阻塞?

    我希望能够打电话recv 不必阻塞 所以我想让它成为非阻塞 但我不希望它在发送数据时是非阻塞的 那么能否将套接字设为非阻塞 recv 函数 或者阻塞 非阻塞模式是否影响所有套接字函数 对于 Windows 您可以使用ioctlsocket
  • 如何验证 SQL Server 流量是否已加密?

    我需要证明我们应用程序连接字符串中的加密设置有效 验证从我们的网站到 SQL Server 的流量是否确实已加密的最简单方法是什么 你可以使用类似的东西Wireshark http www wireshark org 查看通过网络传输的数据
  • 如何搜索包含表情符号的文本?

    我们有一个 MySQL InnoDB 表 带有一个文本字段COLLATE utf8mb4 unicode ci 我需要搜索包含任何表情符号字符的行 我搜索了相当多的问题 但人们似乎有一个他们正在搜索的表情符号列表 我实际上正在寻找一种可以找
  • Powershell调试事件-Action代码块

    我有脚本监视特定目录中的文件创建 我在创建 System IO FileSystemWatcher 后使用 Register ObjectEvent 它工作得很好 但如果我在 Action 代码块中设置断点 IDE 会生成 警告 不会命中
  • 如何修复 titleView 在转换过程中被屏蔽到导航栏的问题?

    在我的视图控制器中我设置titleView to a UIView其中包含一个UIImageView在其图层上使用 setCornerRadius 将其制成圆形 圆圈的上半部分位于导航栏上方 下半部分位于视图上方 如下所示 现在 当我推动此
  • 在 __init__ 中使用属性设置器

    如何在中使用属性设置器 init 没有 pylint 抱怨该属性已在外部定义 init 例如 以下代码仅产生一个异常 该异常被底部的 try 子句捕获 class CircleNotUsingSetterInInit object def
  • 如何在seaborn中记录比例

    我正在使用seaborn 绘制一些生物学数据 我想要一个基因相对于另一个基因的分布 在约 300 名患者中表达 并且以下代码工作正常 graph sns jointplot x Gene1 y Gene2 data data kind re
  • java ee http-basic 身份验证错误页面

    使用 Java EE 中基于表单的身份验证来保护 Web 应用程序 我们可以指定登录和错误 html 页面 http docs oracle com javaee 5 tutorial doc bncbe html http docs or
  • 如何在Python中将字符串转换为复数?

    我正在尝试将输入字符串转换为浮点数 但是当我这样做时 我不断收到某种错误 如下面的示例所示 gt gt gt a 3 3j gt gt gt b complex a Traceback most recent call last File
  • 如何以编程方式创建 Azure AD 用户?

    我知道有一个天蓝色的门户可以管理组 用户等 有什么方法可以以编程方式执行此操作 使用 web api 或 C 中的 sdk 提前致谢 使用 Microsoft Graph REST 可以轻松创建 Azure AD 用户 这是一个代码示例供您
  • x86-64 Linux 中不再允许使用 32 位绝对地址?

    64 位 Linux 默认使用小内存模型 将所有代码和静态数据置于 2GB 地址限制以下 这确保您可以使用 32 位绝对地址 旧版本的 gcc 对静态数组使用 32 位绝对地址 以便节省相对地址计算的额外指令 然而 这不再有效 如果我尝试在
  • Vite Vue 3 库构建并不隐式包含 dist/style.css

    我构建了一个库项目 Vue 3 Vite 我想通过以下方式将其包含在主机项目中package json 但我遇到了一个问题 我可以导入组件并使用这些导入的组件运行一个简单的程序 但它们的样式消失了 请让我知道我的配置有什么问题 当我必须手动
  • 我无法更改 Eclipse 中包资源管理器的字体大小

    我尝试从菜单更改 Eclipse 中包资源管理器的字体大小Window 优先 General 外貌 并且我无法更改字体大小 我怎样才能做到这一点 我在 Windows 7 上使用 Eclipse v4 2 Juno 在 Juno 及更高版本
  • 在 Kohana 3.2 视图中输出图像

    我有以下脚本将图像输出到浏览器 效果很好 file to output SERVER DOCUMENT ROOT static imgs uploads 20110318172207 16 jpg header Content Type i
  • 产生 ENOENT node.js 错误

    我已经使用express generator启动了一个node js应用程序 我有一个奇怪的问题 我无法通过浏览器查看页面两次 第一次加载正常 第二次加载失败 因为节点进程以出现以下错误 GET 304 412ms events js 72
  • 如何使用 Angular JS 处理表单中的多个提交按钮?

    我正在使用 AngularJS 并且有一个用户可以输入数据的表单 在表单的末尾 我想要有两个按钮 一个用于 保存 它将保存并转到另一页 另一个标记为 保存并添加另一个 的按钮将保存表单 然后重置它 允许他们输入另一个条目 我如何以角度实现这
  • 如何验证 SharePoint 用户凭据

    我需要从我的桌面应用程序 用 C 编写 访问共享点应用程序 我应该如何传递凭据并验证身份验证 1 将WebService引用 名称 SourceLists 添加到项目中 Web服务URL https sites vti bin lists
  • 获取当前Windows Phone 7设备的ID

    有没有一种方法可以唯一地识别我的应用程序正在运行的 Windows Phone 设备 有 Windows Phone 设备 ID 之类的吗 Try DeviceExtendedProperties GetValue DeviceUnique
  • Typescript 和 React:使用解构的事件处理程序的正确类型是什么?

    当我在 React 中使用事件处理程序时 我遇到了 Typescript 严格性的问题 具体来说 我无法使用对象解构handleClick 进行的功能onClick handleClick 属性 这是不干净的版本 它是唯一一个打字稿没有抱怨