reactjs - 与 TypeScript 反应的 onKeyDown 事件
问题描述
在我的 React 组件中,我有以下输入元素:
<input
max={120}
type="number"
value={numValue}
onKeyDown={handleKeyDown}
/>
这是我的handleKeyDown
功能:
const handleKeyDown = (evt: KeyboardEvent) => {
console.log(evt.key);
console.log(evt.target.value);
}
这是我从 TypeScript 得到的错误
Property 'value' does not exist on type 'EventTarget'.
我需要分配什么事件类型才能同时涵盖 theevt.target.value
和evt.key
?
解决方案
有两个问题:
你编写代码的方式会阻止 TypeScript 编译器推断事件当前目标的类型。您可以像这样内联函数:
<input max={120} type="number" value={numValue} onKeyDown={(evt) => {...}} />
或像这样帮助编译器:
const handleKeyDown = (evt: React.KeyboardEvent<HTMLInputElement>) => {...}
但是问题不会消失,因为即使在这种情况下我们确定它evt.target
是 的一个实例HTMLInputElement
,我们也不能在一般情况下。例如,如果您的事件处理程序附加到<div>
带有<input>
内部的 a,则由于事件冒泡,因此div
可以接收evt.target
不是 anHTMLDivElement
而是 an的事件!HTMLInputElement
evt.currentTarget
会达到你想要的。或者,在这种特殊情况下,类型断言 ( (evt.target as HTMLInputElement).value
) 也是安全的。
推荐阅读
- sql - 如何将位字符串类型从 Postgres 移植到 Snowflake?
- laravel - (Laravel 8.x)从数据库中获取数据并直接从主布局中使用它而不从参数传递它
- php - 使用 TCPDF 不显示会话消息
- javascript - 谷歌应用程序脚本获取范围以某种方式不起作用我做错了什么?
- html - 如何在boostrap 4中对齐容器中心的导航栏
- python - 将 Scip 与 CPLEX 或 Gurobi 链接
- xml - Oracle 12c,将 SOAP 响应存储到变量中或插入到表中
- python - 如何从元组列表的一部分中提取随机元素?
- php - 传递给 Illuminate\Database\Grammar::parameterize() 的 Laravel 工厂参数 1 必须是数组类型,给定字符串
- html - 嵌套 *ngFor 循环角度中(更改)事件输入的错误值