【问题标题】:Property 'value' does not exist on type EventTarget (ts2339)EventTarget 类型上不存在属性“值”(ts2339)
【发布时间】:2021-06-03 17:20:45
【问题描述】:

我得到了波浪线:

你可以看到我输入正确(我认为)。

  const hClick = (e:React.MouseEvent<HTMLButtonElement>)=>{
    console.log(e.target.value)
  }

这是有问题的元素。

      {props.question.responses.map((r: string, i: number) => {
        return <button key={i} value={r} className={`${CSS.columnBtn} ${CSS.gray}`} onClick={(e) => hClick(e)}>{r}</button>;
      })}

您可以清楚地看到它具有价值。我也做了我的研究。不仅按钮本身具有值,而且 MS said in their docs 它们具有值属性,就像每个 Mozilla 的 general button element 一样,当我 ctrl + 单击 HTMLButtonElement 的 d.ts 文件时,它显示一个值属性,它是一个字符串:

    /**
     * Sets or retrieves the default or selected value of the control.
     */
    value: string;

此外,代码有效并记录了值。我对 TypeScript 很陌生,所以可能有些东西我不知道,这就是我想学习的。

顺便说一句,如果给定元素中不存在某个属性,但您给它一个自定义属性,它显然不会在 d.ts 中,那么您将如何告诉编译器您的 html 属性 foo[="bar "] 是否存在于事件中?

【问题讨论】:

  • 如果你改用currentTarget呢?

标签: javascript reactjs typescript


【解决方案1】:

由于target 可以是任何其他潜在元素(甚至是非元素),您可以使用类型断言将其变为HTMLButtonElement

const hClick = (e:React.MouseEvent<HTMLButtonElement>)=>{
    let button = e.target as HTMLButtonElement;
    console.log(button.value)
}

我查看 React Typings,HTMLButtonElement 最终会出现在 currentTarget(这是有道理的,因为这是侦听器附加到的元素,它是一个按钮)。

所以你可以使用:

const hClick = (e:React.MouseEvent<HTMLButtonElement>)=>{
    console.log(e.currentTarget.value)
}

【讨论】:

  • 我尝试了你的第一个建议并且它有效,但就创建按钮对象而言,我认为 e:React.MouseEvent 的全部意义在于告诉编译器对象类型,以便中介不必要。否则有什么意义?我尝试了您的第二个建议,它没有产生新的错误,但第一个错误仍然存​​在。
  • 是的,但是HTMLButtonElement 接口不会用于target,因为事件目标可以是其他元素。该类型将使用该 (HTMLButtonElement) 作为其 currentTarget 类型。 currentTarget 仍然有同样的错误?
  • 它喜欢 currentTarget! console.log(e.currentTarget.value)。我现在在新概念空间。我想我明白你的意思。如果您单击一个元素,您是真的单击该元素,还是单击该元素的父元素或该元素的子元素?那正确吗?我必须阅读有关 currentTarget 的更多信息。
  • 是的,target 很可能是子元素,而currentTarget 将始终是监听器所附加的元素。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2017-06-23
  • 2021-05-18
  • 2021-05-27
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多