我使用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);
}
}