이 영역을 누르면 첫 페이지로 이동
Nuhends 의 Tech Life 블로그의 첫 페이지로 이동

Nuhends 의 Tech Life

페이지 맨 위로 올라가기

Nuhends 의 Tech Life

IT / Tech / 재테크 관련 뉴스를 최대한 알기 쉽게 전달하는 Tech 블로그 입니다.

[TypeScript] e.target.target 타입 에러가 나는 이유 ts(2339)

  • 2022.06.04 17:11
  • 프로그래밍/Typescript
반응형

1. 문제 발생

const handleSearchValue = (e: KeyboardEvent<HTMLInputElement>) => {
	setSearchValue(e.currentTarget.value);
	setSearchValue(e.target.value);  // error 발생
};

Property 'value' does not exist on type 'EventTarget'. ts(2339)

 

e.target과 e.currentTarget의 type alias가 다르다구..? 외 안되?!

 

 

react/index.d.ts 를 까보면

// @types/react/index.d.ts

interface BaseSyntheticEvent<E = object, C = any, T = any> {
	nativeEvent: E;
	currentTarget: C;
	target: T;
	// ...
}

-  KeyboardEvent는 BaseSyntheticEvent 타입을 extends하고 있다. 

 

2. currentTarget와 target

1-1. currentTarget: 이벤트 리스너가 바인딩 된 요소 

e.currentTarget의 interface를 까보자.

// @types/react/index.d.ts
interface BaseSyntheticEvent<E = object, C = any, T = any> {
	nativeEvent: E;
	currentTarget: C;
	target: T;
	// ...
}

// e.currentTarget 타입
(property) BaseSyntheticEvent<
	globalThis.KeyboardEvent, 
	EventTarget & HTMLInputElement, 
	EventTarget
>.currentTarget: EventTarget & HTMLInputElement

- currentTarget은 EventTarget에 HTMLInputElement type을 확장한 형태

 

 

1-2. target: 이벤트가 발생한 바로 그 요소

이번에는 e.target의 interface를 까보자.

// e.target 타입
(property) BaseSyntheticEvent<
	globalThis.KeyboardEvent, 
	EventTarget & HTMLInputElement, 
	EventTarget
>.target: EventTarget
  • currentTarget과 달리 EventTarget에 HTMLInputElement를 확장하지 않았음! 

왜 e.target type은 HTMLInputElement를 확장하지 않았을까?

 

 

3. e.target type은 HTMLInputElement를 확장하지 않은 이유 

HTMLInputElement를 확장하지 않은 이유는 EventTarget이 될 수 있는 요소들에는 HTML Element 말고 다른 요소들도 있기 때문임

⇒XMLHttpRequest, FileReader, AudioNode, AudioContext 등등

 

2-1. Event target이 될 수 있는 다른 타입들

  • FileReader 인터페이스

  • XMLHttpRequest 인터페이스

  • AudioNode 인터페이스

  • BaseAudioContext 인터페이스

 

4. 해결책

 

4-1. target 대신 currentTarget 사용

const handleSearchValue = (e: KeyboardEvent<HTMLInputElement>) => {
	// 1. currentTarget과 target이 동일할 경우
	setSearchValue(e.currentTarget.value);

	// 2. n개의 DOM 구조일 경우 -> currentTarget 기준으로 value 찾기
	const target = e.currentTarget;

	const findId = target.querySelector('span').id
	setSearchValue(findId);
		
	const findValue = target.querySelector(span).value
	setSearchValue(findValue);
};

currentTarget과 target이 동일할 경우는 currentTarget을 사용하자.

 

하지만 불가피하게 target을 사용해야 되는 경우가 많다. 그럴 때는 currentTarget을 기준으로 DOM을 탐색해야 한다.  이 경우 currentTarget 밑으로 자식이 n개인 상태에서 자식들의 구조가 복잡한 상황에서 특정 자식을 찾는 경우 findChild(’childName’) 식으로 순차적으로 [자식 → 자식의 자식 → … ] 순으로 재귀 탐색을 해야 해서 비용이 큰 작업이 돼서 부담이 될 수 있기 때문에 이럴 경우는 다음 해결책을 추천

 

4-2. 타입 단언(type assertion)

const handleSearchValue = (e: KeyboardEvent<HTMLInputElement>) => {
	setSearchValue((e.target as HTMLInputElement).value);
};

보통 타입 단언을 지양하지만, target이 되는 DOM이 문서에서 명확하게 정해져 있다면 이 경우는 타입 단언하는 방식을 사용해도 괜찮을 것 같음.

 

 

4-3. ChangeEvent 사용

// e: ChangeEvent<HTMLInputElement>로 타입을 줄 경우 
// ChangeEvent는 EventTarget을 확장하고 있어 해당 에러가 발생하지 않음

// React/index.d.ts
interface ChangeEvent<T = Element> extends SyntheticEvent<T> {
	target: EventTarget & T;
}

const handleSearchValue = (e: ChangeEvent<HTMLInputElement>) => {
	setSearchValue(e.currentTarget.value);    
}

 

 

참고: ChangeEvent, KeyboardEvent 각각 interface 비교

반응형
저작자표시 비영리 변경금지 (새창열림)

'프로그래밍 > Typescript' 카테고리의 다른 글

[이펙티브 타입스크립트] 객체 래퍼 타입 피하기  (0) 2022.06.10
[이펙티브 타입스크립트] 타입 공간과 값 공간의 심벌 구분하기  (0) 2022.06.05
[이펙티브 타입스크립트] #4 구조적 타이핑에 익숙해지기  (0) 2022.06.05

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [이펙티브 타입스크립트] 객체 래퍼 타입 피하기

    [이펙티브 타입스크립트] 객체 래퍼 타입 피하기

    2022.06.10
  • [이펙티브 타입스크립트] 타입 공간과 값 공간의 심벌 구분하기

    [이펙티브 타입스크립트] 타입 공간과 값 공간의 심벌 구분하기

    2022.06.05
  • [이펙티브 타입스크립트] #4 구조적 타이핑에 익숙해지기

    [이펙티브 타입스크립트] #4 구조적 타이핑에 익숙해지기

    2022.06.05
다른 글 더 둘러보기

정보

Nuhends 의 Tech Life 블로그의 첫 페이지로 이동

Nuhends 의 Tech Life

  • Nuhends 의 Tech Life의 첫 페이지로 이동
반응형

검색

메뉴

  • 홈
  • 웹 개발
  • 경제 데이터
  • 경제 공부
  • 방명록

카테고리

  • 분류 전체보기 (127)
    • 프로그래밍 (69)
      • React (3)
      • HTML&CSS 사전 (13)
      • JAVASCRIPT 사전 (11)
      • Algorithm (23)
      • 이슈 정리 (2)
      • 개발 환경 (4)
      • NodeJS (1)
      • Typescript (4)
      • NextJS (5)
      • React-Query (2)
      • ai (1)
    • 경제 데이터 (22)
      • 주식 순위 (20)
      • 경제지표 (2)
    • 경제 공부 (25)
      • 경제 신문 읽기 (3)
      • 세금 재테크 (7)
      • 인사이트 (4)
      • 경제용어정리 (9)
      • 정부 지원 제도 관련 (2)
    • 팁 모음 (11)
      • 인터넷 (5)
      • 생활 (3)
      • SNS 맛집 (3)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 알고리즘
  • 코테 풀이
  • 프로그래머스
  • 자바스크립트
  • 코테
  • 코딩테스트
  • javascript
  • softeer

나의 외부 링크

정보

nuhends의 Nuhends 의 Tech Life

Nuhends 의 Tech Life

nuhends

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © nuhends. Designed by Fraccino.

티스토리툴바