TypeScript中的EventTarget类型中不存在属性"value"

Rav*_*avy 80 javascript typescript angular

所以下面的代码是在Angular 4中,我无法弄清楚为什么它没有像预期的那样工作.

这是我的处理程序的片段:

onUpdatingServerName(event: Event) {
  console.log(event);
  this.newserverName = event.target.value; //this wont work
}
Run Code Online (Sandbox Code Playgroud)

HTML元素:

<input type="text" class="form-control" (input)="onUpdatingServerName($event)">
Run Code Online (Sandbox Code Playgroud)

代码给了我错误:

'EventTarget'类型中不存在属性'value'.

但正如可以看出console.log,价值确实存在于event.target.

Li3*_*357 100

event.target这里是一个HTMLElement是所有的HTML元素的父,但不保证具有这样的性质value.TypeScript检测到此并抛出错误.铸造event.target到相应的HTML元素,以确保它HTMLInputElement里面确实有一个value特性:

(<HTMLInputElement>event.target).value
Run Code Online (Sandbox Code Playgroud)

根据文件:

输入 $event

上面的示例将其转换$eventany类型.这样可以降低代码的成本.没有类型信息可以揭示事件对象的属性并防止愚蠢的错误.

[...]

$event现在是一个特定的KeyboardEvent.并非所有元素都具有value属性,因此它会转换target为输入元素.

(强调我的)

  • 更简洁的语法`var element = ev.target as HTMLElement` (17认同)
  • 对我来说,HTMLInputElement 而不是 HTMLElement 起作用,因为 HTMLElement 在界面中没有价值。 (5认同)
  • 在我看来,最好的方法是在被调用的函数中包含 `onFieldUpdate(event: { target: HTMLInputElement }) {`。请参阅下面我的回答。 (3认同)

Mik*_*ank 59

将HTMLInputElement作为事件类型的通用传递也应该起作用:

onUpdatingServerName(event: React.ChangeEvent<HTMLInputElement>) {
  console.log(event);
  this.newserverName = event.target.value;
}
Run Code Online (Sandbox Code Playgroud)

  • 这比类型断言更好. (8认同)
  • 但是,如果从 React 代码中的“onChange”属性处理程序引用调用该函数,则这将不起作用。react 处理程序不希望为 React.ChangeEvent 设置类型,并且会显示输入错误。我不得不使用强制转换(event.target as HTMLInputElement).value 来恢复到所选答案(的变体)。 (4认同)

小智 31

这是另一个适合我的修复:

(event.target as HTMLInputElement).value

这应该通过让TS知道这event.target是一个HTMLInputElement本身具有的错误来摆脱错误value.在指定之前,TS可能只知道event单独是一个HTMLInputElement,因此根据TS,键入的target是一些随机映射的值,可以是任何东西.

  • 这在React试图将&lt;HTMLInputElement&gt;解释为JSX时确实很有帮助。 (2认同)

小智 29

在模板中 -

`(keyup)="value2=$any($event.target).value"`
Run Code Online (Sandbox Code Playgroud)

在组件中 -

getInput(event: Event) {
  this.value1 = (event.target as HTMLInputElement).value;
}
Run Code Online (Sandbox Code Playgroud)


Bea*_*ith 10

我一直在寻找针对React的类似TypeScript错误的解决方案:

TypeScript中的EventTarget类型不存在属性“数据集”

我想了解event.target.datasetReact中的一个单击按钮元素:

<button
  onClick={onClickHandler}
  data-index="4"
  data-name="Foo Bar"
>
  Delete Candidate
</button>
Run Code Online (Sandbox Code Playgroud)

这是我如何dataset通过TypeScript 将值“存在”的方法:

const onClickHandler = (event: React.MouseEvent<HTMLButtonElement>) => {
  const { name, index } = (event.target as HTMLButtonElement).dataset
  console.log({ name, index })
  // do stuff with name and index…
}
Run Code Online (Sandbox Code Playgroud)

  • 无论如何......它有多个赞成票,因此这个答案对其他人有帮助。 (4认同)
  • 奇迹般有效。`onChange={(事件: ChangeEvent&lt;HTMLInputElement&gt;): void =&gt; { setTextFilter(event.target.value); }}` (3认同)
  • 问题被标记为 Angular,因此 React 答案似乎偏离主题。 (2认同)

bel*_*ref 10

我这样做的方式如下(比类型断言更好):

onFieldUpdate(event: { target: HTMLInputElement }) {
  this.$emit('onFieldUpdate', event.target.value);
}
Run Code Online (Sandbox Code Playgroud)

这假设您只对target属性感兴趣,这是最常见的情况。如果您需要访问 的其他属性event,更全面的解决方案涉及使用&类型交集运算符:

event: Event & { target: HTMLInputElement }
Run Code Online (Sandbox Code Playgroud)

这是一个 Vue.js 版本,但这个概念适用于所有框架。显然你可以更具体,而不是使用一般的,HTMLInputElement你可以使用例如HTMLTextAreaElementtextareas。


Fai*_*mad 7

要解决此问题,请使用 $any 类型转换函数($any($event.target).value)来停止模板中的类型检查。

在这里阅读更多内容。


Azh*_*ikh 7

React有一些接口,例如ChangeEventfor onChangeFormEventfor onSubmit

我也尝试做类似的事情,下面的解决方案对我有用

handleChange (e : React.ChangeEvent<HTMLInputElement>) {
  console.log(e.currentTarget.value);
}


<input 
   autoFocus
   value={this.state.account.username}
   onChange={this.handleChange}
   id="username" 
   type="text" 
   className="form-control" 
/>
Run Code Online (Sandbox Code Playgroud)