Javascript 财产';价值';类型EventTarget(ts2339)上不存在

Javascript 财产';价值';类型EventTarget(ts2339)上不存在,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,我有点歪歪扭扭的: 你可以看到我打对了(我想) consthclick=(e:React.MouseEvent)=>{ console.log(例如target.value) } 这就是问题所在 {props.question.responses.map((r: string, i: number) => { return <button key={i} value={r} className={`${CSS.columnBtn} ${CSS.gray

我有点歪歪扭扭的:

你可以看到我打对了(我想)

consthclick=(e:React.MouseEvent)=>{
console.log(例如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>;
      })}
更重要的是,代码工作并记录值。我对打字很陌生,所以可能有些东西我不知道,这就是我想学的


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

因为
目标
可能是任何其他潜在的元素(甚至是非元素)您可以使用类型断言将其转换为
HTMLButtonElement

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

如果改用
currentTarget
怎么办?我尝试了你的第一个建议,效果不错,但就创建button对象而言,我认为e:React.MouseEvent的整个要点是告诉编译器对象类型,这样就不需要中介了。否则有什么意义?我尝试了你的第二个建议,但没有产生新的错误,但第一个错误仍然存在。是的,但是
HTMLButtonElement
接口将不会用于
target
,因为事件目标可以是其他元素。该类型将使用(
HTMLButtonElement
)进行其
currentTarget
键入。您仍然存在与
currentTarget
相同的错误?它喜欢currentTarget<代码>控制台.log(e.currentTarget.value)。我现在在新概念空间。我想我明白你的意思了。如果单击某个元素,您是真的在单击该元素,还是在单击该元素的父元素或该元素的子元素?是这样吗?我必须阅读更多关于currentTarget的内容。是的,
target
很可能是一个子元素,而
currentTarget
将始终是侦听器附加到的元素。
const hClick = (e:React.MouseEvent<HTMLButtonElement>)=>{
    console.log(e.currentTarget.value)
}