网站搜索

在 React + TypeScript 中,我如何通过类型推断直接知道“事件对象的类型”?


(VSCode)

当我将事件与 jsx 代码分离时。(在 class Component 中)

像这样⬇

 handleSubmit = e => { ...}


render(){
return (
  <>
    <form onSubmit={this.handelSubmit}>
      <input
        ref={this.onRefInput}
        type='number'
        value={this.state.value}
        onChange={this.onChange}
      />
      <button>입력!</button>
    </form>
  </>
);}

通常当其他人在“onSubmit”上悬停光标时

tsc 说

"React.DOMAttributes< HTMLFormElement >onSubmit?:(event: React.FormEvent< HTMLFormElement >)=> void) | undefined "

在此输入图片描述

所以,我们可以直接知道事件对象的类型!(event: React.FormEvent)

✅ 问题是我的代码没有像上面那样宣布。

我的 tsc 说

"React.DOMAttributes< HTMLFormElement >.onSubmit?: React.FormEventHandler< HTMLFormElement > | undefined"

所以,我无法直接知道事件对象的类型!

我知道还有许多其他方法可以了解事件对象的类型。

但我想通过类型推断直接了解事件对象的类型!

📍我如何通过类型推断直接了解事件对象的类型?

答案#1

你可以把类型分配给函数本身,或者分配给函数的参数,也就是事件。


React.FormEventHandler<HTMLFormElement>

这是函数的类型。如果你这样使用它:

handleSubmit: React.FormEventHandler<HTMLFormElement> = e => {
}

那么变量 e 的类型将会自动推断为 React.FormEvent<HTMLFormElement>。所以你实际上不需要知道事件的类型,因为你可以将类型应用到函数本身,从而获得正确的类型。


或者你可以将类型分配给事件参数 e。

handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
}

现在 handleSubmit 属性的类型被推断为 (e: React.FormEvent<HTMLFormElement>) => void。

答案#2

提前为此道歉,这个答案不是完整的解决方案

我遇到了同样的问题,我搜索了很多,并尝试更改所有关于 typescript.inlayHints 的 settings.json。不幸的是,什么都没用。

所以我去实现 onSubmit

如果你按住命令键(在其他操作系统可能是 Ctrl 键)悬停在 onSubmit 上,你可以进入 index.d.ts 然后你就可以看到

        onSubmit?: FormEventHandler<T> | undefined;

所以我把它改成了

        onSubmit?: (event: FormEvent<T>) => void | undefined;

现在我可以得到你想要的了

我认为,node_modules/@types/react/index.d.ts 的新版本结果像第一张图片一样。

使用 Eventhandler 类型也是一个不错的解决方案,如果你将鼠标悬停在 e 参数上,你可以看到事件对象