“EventTarget”类型中不存在属性“值”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“EventTarget”类型中不存在属性“值”相关的知识,希望对你有一定的参考价值。

我使用TypeScript版本2作为Angular 2组件代码。

我收到错误“属性'值'在类型'EventTarget'上不存在”下面的代码,可能是解决方案。谢谢!

e.target.value.match(/ S + / g)|| [])。长度

import { Component, EventEmitter, Output } from '@angular/core';

@Component({
selector: 'text-editor',
template: `
<textarea (keyup)="emitWordCount($event)"></textarea>
 `
 })
  export class TextEditorComponent {
   @Output() countUpdate = new EventEmitter<number>();

emitWordCount(e: Event) {
    this.countUpdate.emit(
        (e.target.value.match(/S+/g) || []).length);
}
}
答案

您需要明确告诉TypeScript您的目标htmlElement的类型。

这样做的方法是使用泛型类型将其强制转换为正确的类型:

this.countUpdate.emit((<HTMLTextAreaElement>e.target).value./*...*/)

或者(如你所愿)

this.countUpdate.emit((e.target as HTMLTextAreaElement).value./*...*/)

或(再次,偏好问题)

const target = e.target as HTMLTextAreaElement;

this.countUpdate.emit(target.value./*...*/)

这将让TypeScript知道该元素是textarea并且它将知道value属性。

任何类型的HTML元素都可以这样做,每当你给TypeScript更多关于它们的类型的信息时,它会给你带来适当的提示,当然还有更少的错误。

为了使将来更容易,您可能希望直接使用其目标类型定义事件:

// create a new type HTMLElementEvent that has a target of type you pass
// type T must be a HTMLElement (e.g. HTMLTextAreaElement extends HTMLElement)
type HTMLElementEvent<T extends HTMLElement> = Event & {
  target: T; 
  // probably you might want to add the currentTarget as well
  // currentTarget: T;
}

// use it instead of Event
let e: HTMLElementEvent<HTMLTextAreaElement>;

console.log(e.target.value);

// or in the context of the given example
emitWordCount(e: HTMLElementEvent<HTMLTextAreaElement>) {
  this.countUpdate.emit(e.target.value);
}
另一答案

这是我使用的简单方法:

let element = event.currentTarget as HTMLInputElement;
let value = element.value;

TypeScript编译器显示的错误消失了,代码也可以运行。

另一答案
fromEvent<KeyboardEvent>(document.querySelector('#searcha') as HTMLInputElement , 'keyup')
    .pipe(
      debounceTime(500),
      distinctUntilChanged(),
      map(e  => {
            return e.target['value']; // <-- target does not exist on {}
        })
    ).subscribe(k => console.log(k));

也许像上面这样的东西可以帮助。根据实际代码更改它。问题是........ target ['value']

另一答案

我相信它必须有效,但我无法识别任何方式。其他方法可以,

<textarea (keyup)="emitWordCount(myModel)" [(ngModel)]="myModel"></textarea>


export class TextEditorComponent {
   @Output() countUpdate = new EventEmitter<number>();

   emitWordCount(model) {
       this.countUpdate.emit(
         (model.match(/S+/g) || []).length);
       }
}
另一答案

这是另一种指定event.target的方法:

import { Component, EventEmitter, Output } from '@angular/core';

@Component({
    selector: 'text-editor',
    template: `<textarea (keyup)="emitWordCount($event)"></textarea>`
})
export class TextEditorComponent {

   @Output() countUpdate = new EventEmitter<number>();

    emitWordCount({ target = {} as HTMLTextAreaElement }) { // <- right there

        this.countUpdate.emit(
          // using it directly without `event`
            (target.value.match(/S+/g) || []).length);
    }
}

以上是关于“EventTarget”类型中不存在属性“值”的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 中的 EventTarget 类型不存在属性“值”

TS2339:“EventTarget”类型上不存在“最近”属性。 - 如何在 React 中获取原生 event.target?

如何解决“从不”类型中不存在属性

“对象”类型中不存在属性“位置”

属性在模板中不存在,尽管它已分配

错误“字符串”类型中不存在属性“getItem”.ts(2339)