TypeScript

Type Assertion, 타입 단언의 올바른 사용법 고민하기

2023. 9. 1. 11:02
목차
  1. 타입 단언 사용방법
  2. 타입 단언 사용 시 고려해야할 것들
  3. 복잡한 Type Casting 코드 개선하기 ( aka. 타입 단언 사용하지 않기)

타입 단언은 타입에 확신이 있을 때 사용하는 타입 지정 방식이다. 나 같은 경우에는 `Unsafe member access ~~` 에러가 발생했을 때 주로 타입 단언을 통해 해결했었다. 

 

타입 단언 사용방법

타입 단언은 기본적으로 as 키워드를 사용하여 정의한다. 

const name = '김씨' as string

타입 단언은 타입 에러를 해결하기 위한 좋은 수단이지만 다음 몇가지 사항을 고려해서 사용해야 한다.

타입 단언 사용 시 고려해야할 것들

1. 타입 안정성 : Type Assertion, 즉 타입 단언을 사용하게 되면 Typescript 유형 검사를 우회하게 된다. 따라서 잘못된 타입으로 단언이 되어 있는 경우 런타임 오류가 발생하거나 실제 값과 일치하지 않는 타입 단언으로 인해 사이드 이펙트가 발생할 수 있다.

2. 유지 관리 : 타입 단언을 과도하게 사용하면 코드 유지보수에 악영햘을 줄 수 있다. 코드의 구조나 형태가 변경되는 경우 그에 영향 받는 모든 타입 단언도 변경된 내용에 맞게 함께 업데이트를 해줘야 하기 때문이다.

3. 타입 추론 : Typescript 는 명시적으로 타입을 지정하지 않아도 해당 Type에 대해 추론을 할 수 있다. 가능한 경우에는 유형 추론에 의존함으로써 불필요한 타입 단언을 줄이고 Type의 안정성을 유지하는게 좋다.

4. 복잡한 Type Casting : 정확하게 Type casting이 필요한 중첩 구조의 경우 타입 단언을 사용하면 위험할 수 있다. 복잡한 환경에서 연관된 데이터, 이벤트 구조와 타입 단언이 정확하게 일치하는지 항상 확인해야하기 때문이다.

 

복잡한 Type Casting을 명확하게 확인할 수 있는 사례를 바로 어제 경험하여 공유하고자 한다.

어제 겪은 에러가 딱 복잡한 Type Casting과 연관된 에러였기에 예시가 궁금하신 분은 아래 부분을 참고하면 되겠다.

 

Error | 중첩된 객체(객체 안의 객체) 형태의 상태 onChange 함수 구현하기

중첩된 객체, 즉 객체 안의 객체 형태의 state 가 존재할 때, 이 state 를 업데이트 하기 위한 onChange 함수를 구현하는 방법을 공유하고자 한다. 에러 발생 상황 제목 그대로 중첩된 객체 형태의 상태

kk3june.tistory.com

그럼 위 포스팅은 중첩된 데이터 구조의 타입 에러를 타입 단언으로 해결한 사례인데, 중첩된 구조이다 보니 타입 단언 역시 복잡해졌다. 

복잡한 Type Casting 코드 개선하기 ( aka. 타입 단언 사용하지 않기)

const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = event.target;
    const [key, innerKey] = name.split('-');  // name = 'address-city' , 'address-province'

   const updatedState = {...state};
   (updatedState[key as keyof OverLappedState] as Address)[innerKey as keyof Address] = value
 };

위 코드로 타입에러를 해결하기는 했지만 타입 단언이 과도하게 사용되어 데이터 구조, 2가지 타입 중 한 군데에서라도 수정이 발생하면 다시 코드를 작성해야하는 유지보수에 굉장히 불편한 코드임을 한 눈에 볼 수 있다. 

개선된 코드

const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = event.target;
    const [key, innerKey] = name.split('-');  // name = 'address-city' , 'address-province'
	
    if(key !== 'address') return;
    if(!(innerKey in state[key])) return;
    
    const updatedState = { ...state, [key]: {...state[key], [innerKey]: value} }
};

이렇게 처리할 데이터 구조를 제외하고는 해당 함수에서 사용하지 않도록 작성하면 타입 단언 없이도 원하는 기능을 구현할 수 있다.

이렇게 구현하기 훨씬 가독성도 좋고 유지보수도 편하게 코드를 작성할 수 있었다. 

 

💡 any와 마찬가지로 타입단언 역시 불필요한 경우가 아니면 지양하기로 하자.
     개발 잘하는 사람들의 코드를 보고 공부해야하는 이유!!

 

'TypeScript' 카테고리의 다른 글

TS | insertAdjacentElement 사용하여 자식 element 만들기  (0) 2022.05.16
TypeScript | eventListener void 타입 에러 (Feat. onClick)  (0) 2022.02.11
  1. 타입 단언 사용방법
  2. 타입 단언 사용 시 고려해야할 것들
  3. 복잡한 Type Casting 코드 개선하기 ( aka. 타입 단언 사용하지 않기)
'TypeScript' 카테고리의 다른 글
  • TS | insertAdjacentElement 사용하여 자식 element 만들기
  • TypeScript | eventListener void 타입 에러 (Feat. onClick)
3jun
3jun
3jun
3jun
3jun
전체
오늘
어제
  • 분류 전체보기 (94)
    • 프로젝트 (5)
    • Web (9)
    • JavaScript (19)
    • React (12)
    • 알고리즘 (31)
    • Git (3)
    • AWS (3)
    • TypeScript (3)
    • CS (2)
    • Error (6)
    • 회고 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • react
  • 백준 코테
  • 유효성 로직
  • Promise
  • outer environment
  • state
  • airbnb style guide
  • JavaScript
  • 프로그래머스 코테
  • this.props.history.push
  • 프로그래머스 코딩테스트
  • 백준 js
  • 백준 온라인저지
  • msw
  • 프로그래머스 js
  • 백준 알고리즘
  • 프로그래머스 코딩테스트 js
  • 자바스크립트
  • msw 에러
  • 백준js

최근 댓글

최근 글

hELLO · Designed By 정상우.
3jun
Type Assertion, 타입 단언의 올바른 사용법 고민하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.