ChatGPT解决这个技术问题 Extra ChatGPT

TypeScript 中的 EventTarget 类型上不存在属性“值”[重复]

这个问题在这里已经有了答案:Property 'value' does not exist on type 'EventTarget' (16 answers) Closed 17 days ago。

所以下面的代码在 Angular 4 中,我不知道为什么它不能按预期的方式工作。

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

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

HTML 元素:

<input type="text" class="form-control" (input)="onUpdatingServerName($event)">

代码给了我错误:

“EventTarget”类型上不存在属性“值”。

但从 console.log 中可以看出,event.target 上确实存在该值。

我们可以使用 (e.target as HTMLInputElement).value
兄弟,我为此苦苦挣扎了几个小时,您只需从方法中删除类型。 onUpdatingServerName(事件);

r
rofrol

这里的 event.target 是一个 HTMLElement,它是所有 HTML 元素的父元素,但不能保证具有属性 value。 TypeScript 检测到这一点并抛出错误。将 event.target 转换为适当的 HTML 元素,以确保它是具有 value 属性的 HTMLInputElement

(event.target as HTMLInputElement).value

the documentation

键入 $event 上面的示例将 $event 转换为 any 类型。这以某种代价简化了代码。没有类型信息可以揭示事件对象的属性并防止愚蠢的错误。 [...] $event 现在是一个特定的 KeyboardEvent。并非所有元素都具有 value 属性,因此它将目标转换为输入元素。

(强调我的)


更简洁的语法 var element = ev.target as HTMLElement
对我来说,HTMLInputElement 代替了 HTMLElement 起作用,因为 HTMLElement 在界面中没有价值。
在我看来,最好的方法是在被调用函数中包含 onFieldUpdate(event: { target: HTMLInputElement }) {。请看下面我的回答。
对于 Angular 9,使用“as”语法。 event.target as HtmlInputlement
@Prescol您有一个错字。这是event.target as HTMLInputElement
M
Mikael Lirbank

将 HTMLInputElement 作为泛型传递给事件类型也应该有效:

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

这比类型断言更好。
但是,如果从 React 代码中的 onChange proeperty 处理程序引用调用该函数,这将不起作用。反应处理程序不希望为 React.ChangeEvent 设置类型,并将显示键入错误。我不得不使用强制转换恢复到(的变体)所选答案:(event.target as HTMLInputElement).value
这在 React 组件中似乎对我很有效。也许是 React 的版本?我们目前在 16.8.*。
M
Matt S.

这是另一个对我有用的修复:

(event.target as HTMLInputElement).value

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


这在尝试将 解释为 JSX 的 React 中非常有用。
B
Beau Smith

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

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

我想在 React 中访问 event.target.dataset 的单击按钮元素:

<button
  onClick={onClickHandler}
  data-index="4"
  data-name="Foo Bar"
>
  Delete Candidate
</button>

以下是我如何通过 TypeScript 使 dataset 值“存在”:

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

问题被标记为 Angular,因此 React 的答案似乎离题了。
无论如何......它有多个赞成票,因此这个答案对其他人有帮助。
奇迹般有效。 onChange={(event: ChangeEvent<HTMLInputElement>): void => { setTextFilter(event.target.value); }}
K
Koustav

在模板中 -

`(keyup)="value2=$any($event.target).value"`

在组件中 -

getInput(event: Event) {
  this.value1 = (event.target as HTMLInputElement).value;
}

这是迄今为止最优雅的解决方案。
b
belvederef

我这样做的方式如下(优于类型断言恕我直言):

onFieldUpdate(event: { target: HTMLInputElement }) {
  this.$emit('onFieldUpdate', event.target.value);
}

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

event: Event & { target: HTMLInputElement }

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


K
Kartik Chandra

这在 ANGULAR HTML 组件中对我有用!

$any($event.target).value

源链接:https://www.tektutorialshub.com/angular/property-value-does-not-exist-on-type-eventtarget-error-in-angular/


运作良好。感谢你的回答。
J
JillAndMe

如果看不到,则应将 event.target.value 道具与 onChange 处理程序一起使用:

index.js:1437 Warning: Failed prop type: You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.

或者如果您想使用除 onChange 之外的其他处理程序,请使用 event.currentTarget.value


这对我有用,但我不确定使用 event.currentTarget.value 是最好的方法。
F
Faizan Ahmad

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

阅读更多here


这个适用于我的角度 v14
s
shahidfoy

您也可以创建自己的界面。

    export interface UserEvent {
      target: HTMLInputElement;
    }

       ...

    onUpdatingServerName(event: UserEvent) {
      .....
    }

A
Amit Baderia

您可以将其显式解析为“HTMLInputElement”,然后访问“值”

onUpdatingServerName(event: Event) {
  console.log(event);
  this.newserverName = (<HTMLInputElement>event.target).value; 
}

C
Codemaker

如您所知,TypeScript 一直严格按照元素数据类型。因此,您不能在不指定数据类型的情况下直接访问元素的属性。 event.target 是一个 HTMLElement,它是所有 HTML 元素的父级,但不能保证具有 value 属性。

因此,我们需要对变量 event.target 进行类型转换,然后我们才能从中访问 value 属性。

OnUpdatingServerName (event: Event) {
  console.log(event);
  var element = event.target as HTMLElement
  this.newserverName = element.value;
}

I
Igor Sukharev

我建议创建一个实用程序类型:

interface MyEvent<T extends EventTarget> extends Omit<Event, 'target'> {
  target: T;
}

然后像这样使用它:

function onChange({ target: { value } }: MyEvent<HTMLInputElement>) => {
  doSomethingWith(value);
}

V
Vadim Ovchinnikov

声明接口

export interface HTMLInputEvent extends Event {
  target: HTMLInputElement & EventTarget;
}

可以重新用作不同输入事件的类型

public onChange(event: HTMLInputEvent) {
  const value = event.target.value;
}

A
Azhar Uddin Sheikh

React 有一些界面,例如 ChangeEvent 用于 onChangeFormEvent 用于 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" 
/>

A
Alok Kumar Sahoo

请试试这个

<input type = 'text' [value] = 'value' (input) = 'data = $any($event.target).value'>

p
piotrek1543

试试下面的代码:

  console.log(event['target'].value)

这个对我有用 :-)


最好删除你的答案
d
dylanroman03

将任何类型添加到事件

event: any

例子

[element].addEvenListener('mousemove', (event: any) =>{
//CODE//
} )

发生的事情是打字稿将“事件”(在本例中为单击)添加为事件类型,并且由于某种原因它无法识别某些属性。添加它的任何类型不再存在此问题,这适用于任何 document.[Property]


欢迎来到SO!为什么以及如何?请解释。
如果它几乎没有被减去,你可能会删除你的答案
通过添加 any 会在编译时发出警告,并且不建议在 TS 文件中使用 any ,否则使用 ts 文件的目的会死。
@ZeeshanSafdar 我同意你不应该做@dylanroman03 在这里所做的事情,但是 any 在对象实际上可以是任何东西的情况下使用是完全可以的。一般来说,如果您知道对象的属性是什么(就像我们在这里所做的那样),您就不应该使用 any。如果对象可以具有任何属性,则应使用 any