'EventTarget'유형에 'value'속성이 없습니다.


112

Angular 2 구성 요소 코드에 TypeScript 버전 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);
}
}

답변:


186

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가 요소가 a textarea라는 것을 알게되고 value 속성을 알게됩니다.

TypeScript에 유형에 대한 정보를 조금 더 제공 할 때마다 모든 종류의 HTML 요소에서 동일한 작업을 수행 할 수 있습니다. 그러면 적절한 힌트와 물론 오류가 줄어 듭니다.

미래를 더 쉽게 만들기 위해 대상 유형으로 이벤트를 직접 정의 할 수 있습니다.

// 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);
}

@smnbbrv 내 사례는 img 파일 위치이며 SO를 기반으로 img를 표시합니다. 틀 : <img [src]="url"> <br/> <input type='file' (change)="showImg($event)">구성 요소 : ... this.url = event.target.result;언젠가는 그렇지 ERR입니다 때,하지 않는 때로는 작동하지 않습니다 error TS2339: Property 'result' does not exist on type 'EventTarget'당신이 장소에 대해 더 자세히 설명해 TS를 제안한 것처럼 HTMLTextAreaElement내가 시도 HTMLInputElementtarget.value더 이상 오류이지만 이미지가 표시되지 않습니다.
Jeb50

유형에 유형을 전달할 수 없다는 사실에 놀랐습니다 Event. 정말 Event<HTMLInputElement>유형 으로 사용할 수 있어야 합니다.
Ronan

@RoRo 이벤트에는 target, currentTargetsrcElement; 3 개의 제네릭 유형을 입력해야합니다. 예 Event<T = any, C = any, S = any>를 들어 위에서 언급 한 것과 같이 기본 유형 을 사용하더라도 단순한 as명령문 보다 사용하기가 더 불편할 수 있습니다 . 나는 또한 첫 번째 제네릭이되어야하는 것에 대한 잠재적 인 거룩한 전쟁을 상상할 수 있었다 : target또는 currentTarget. 또한 많은 라이브러리가 HTML 이벤트를 남용하여 언급 된 속성에 원하는 것을 넣을 수 있습니다. 아마도 이것이 그들이 내장 제네릭으로하지 않은 이유 일 것입니다
smnbbrv

내 ion-searchbar의 경우(ionChangeEvent.target as HTMLIonInputElement).value as string
Cloud

40

내가 사용한 간단한 접근 방식은 다음과 같습니다.

const element = event.currentTarget as HTMLInputElement
const value = element.value

TypeScript 컴파일러에 표시된 오류가 사라지고 코드가 작동합니다.


5
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']


2

나는 그것이 작동해야한다고 믿지만 내가 식별 할 수없는 어떤 방식 으로든. 다른 접근 방식은 다음과 같습니다.

<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);
       }
}

2

여기에 또 다른 간단한 접근 방식이 있습니다.

    inputChange(event: KeyboardEvent) {      
    const target = event.target as HTMLTextAreaElement;
    var activeInput = target.id;
    }

2

약간 다른 방식으로 내 문제를 검색하는 두 가지 질문에 도달했기 때문에 여기에 도착할 경우를 대비하여 내 대답을 복제하고 있습니다.

호출 된 함수에서 다음을 사용하여 유형을 정의 할 수 있습니다.

emitWordCount(event: { target: HTMLInputElement }) {
  this.countUpdate.emit(event.target.value);
}

이것은 target가장 일반적인 경우 인 속성 에만 관심이 있다고 가정합니다 . 의 다른 속성에 액세스해야하는 경우 event보다 포괄적 인 솔루션은 &유형 교차 연산자를 사용하는 것입니다 .

event: Event & { target: HTMLInputElement }

또한 더 구체적으로 갈 HTMLInputElement수 있으며 사용하는 대신 HTMLTextAreaElement텍스트 영역에 사용할 수 있습니다 .


1

지정하는 또 다른 방법은 다음과 같습니다 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);
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.