• React报错之Property 'value' does not exist on type EventTarget


    正文从这开始~

    总览

    event参数的类型不正确时,会产生"Property 'value' does not exist on type EventTarget"错误。为了解决该错误,将event的类型声明为React.ChangeEvent 。然后就可以通过event.target.value 来访问其值。

    property-value-does-not-exist-on-type-eventtarget.png

    这里有个示例用来展示错误是如何发生的。

    // App.tsx
    
    function App() {
    
      // 👇️ incorrect event type
      const handleChange = (event: Event) => {
        console.log(event.target?.value);
      };
    
      return (
        <div>
          {/* ⛔️ Property 'value' does not exist on type 'EventTarget'. */}
          <input onChange={handleChange} type="text" id="message" />
        div>
      );
    }
    
    export default App;
    

    正确声明类型

    为了解决该错误,我们必须将event参数的类型声明为React.ChangeEvent

    // App.tsx
    
    function App() {
      // ✅ correct event type
      const handleChange = (event: React.ChangeEvent) => {
        console.log(event.target.value);
      };
    
      return (
        <div>
          <input onChange={handleChange} type="text" id="message" />
        div>
      );
    }
    
    export default App;
    

    React中的ChangeEvent类型有一个target属性,引用的是事件被派发的元素。

    找出类型

    你要找出事件的类型,最简单的方法是将事件处理内联编写,并将鼠标悬浮在函数的event参数上。

    // App.tsx
    
    function App() {
      // 👇️ event is written inline
      return (
        <div>
          <input
            onChange={e => console.log(e.target.value)}
            type="text"
            id="message"
          />
        div>
      );
    }
    
    export default App;
    

    react-event-type-inline.png

    截图显示,当我们将鼠标悬停在内联事件处理器的e变量上时,我们便得到了事件的正确类型。

    这种方法适用于所有的事件处理器,一旦你知道了事件的正确类型,你就可以提取你的处理函数并正确得对其类型声明。

    TypeScript总是能够推断出内联事件处理器的事件类型,因为你已经安装了React的类型定义文件。

    # 👇️ with NPM
    npm install --save-dev @types/react @types/react-dom
    
    # ----------------------------------------------
    
    # 👇️ with YARN
    yarn add @types/react @types/react-dom --dev
    

    总结

    为了解决文章开头的错误,我们需要正确的声明event参数的类型。最便捷的找出事件类型的方式是,内联编写事件处理函数,并将鼠标悬浮到e变量上,从而查看真正的事件类型。

  • 相关阅读:
    K8S-存储卷,pv,pvc
    C++ 11 lamdba表达式详解
    [HDLBits] Exams/ece241 2014 q7a
    Servlet 架构思路(MVC)
    Fortran openmp并行打开多个文件
    L1-101 别再来这么多猫娘了!(2024PTA天梯赛)
    Nature Microbiology | SeqCode:基于序列数据描述的原核生物命名规则
    计数与期望
    i.MX6ULL - 问题解决:NFS挂载失败 - VFS: Unable to mount root fs on unknown-block(2,0)
    21天学习挑战赛之java多线程
  • 原文地址:https://www.cnblogs.com/chuckQu/p/16637700.html