【发布时间】:2021-05-30 23:08:33
【问题描述】:
在我使用 Typescript 和 MaterialUI 的 React 应用程序中,我有一个 TextField。
我想在按下enter 时访问input html 元素值。
所以我有以下代码
const keyPress = (e: any) => {
if (e.key === "Enter") {
console.log("Do login", e.target.value);
}
};
在返回的 React 树的某个地方我有这个
<TextField onKeyPress={keyPress} />
此代码有效,但我的问题是我不明白如何为传递给函数 keyPressed 的事件 e 定义正确的类型。
根据 VSCode intellisense 在我将鼠标悬停在 onKeyPress 道具上时的建议,我知道我应该使用 KeyboardEvent<HTMLDivElement>,但问题是我收到一个错误,上面写着 Type 'KeyboardEvent' is not generic。
我做错了什么?
顺便说一句,如果我将事件类型设为 e: { key: string; target: any },一切都会正常工作,但是当我尝试遵循正确的方式时,了解我做错了什么仍然很有趣。
更新
经过更多研究,似乎传递给keyPressed 函数的事件是KeyboardEvent 类型,它的target 属性是EventTarget 类型。
查看global.d.ts在React包中的EventTarget的定义,然后发现是空接口。
在global.d.ts 的 cmets 中,我还读到“警告:所有这些接口都是空的。如果您想要各种属性的类型定义
(比如HTMLInputElement.prototype.value),你需要添加--lib DOM(通过命令行或者tsconfig.json)。但是我的tsconfig.json实际上在库中包含DOM(属性是"lib": ["dom", "dom.iterable", "esnext"],) .
同样,我可以让事情正常进行,但我想了解如何为该事件获取干净的类型。
【问题讨论】:
-
您可以在编辑器中通过在
onKeyPress属性上执行CTRL+click直接看到这一点,这将带您进入material-ui 的*.d.ts文件。 -
@Ajeet Shah 感谢您的回复,但您的建议并不那么简单,至少对我而言。
onKeyPress的类型为KeyboardEventHandler<T>。如果我查看KeyboardEventHandler<T>,我发现它被定义为EventHandler<KeyboardEvent<T>>。然后我查看EventHandler<KeyboardEvent<T>>,它被定义为EventHandler<E extends SyntheticEvent<any>> = { bivarianceHack(event: E): void }["bivarianceHack"];。现在事情对我来说变得有点复杂了。最终结果是我无法为传递给keyPress函数的事件提供一个干净的类型。
标签: reactjs typescript react-typescript react-material