Alraffe
이것 저것 개발.
Alraffe
전체 방문자
오늘
어제
  • 분류 전체보기
    • TIL
    • Front-end
      • CSS
      • React
      • Next.js
    • Back-end
    • Book
      • Effective Typescript

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 타입스크립트 책
  • 주니어 개발자 이력서
  • 깃헙 배포 빈 화면
  • vite 배포 에러
  • 타입스크립트 책 추천
  • 프론트엔드
  • Til
  • 개발자 커피챗
  • 배포 에러
  • 프론트엔드 책 추천
  • 타입스크립트 추천
  • JavaScript
  • evnentBubbling
  • 자바스크립트
  • JASON.parse()
  • 타입스크립트
  • next14
  • 노션 이력서
  • object 값을 찍고 싶을 떄
  • vite 깃헙 배포
  • JASON.stringify
  • 리액트
  • 이펙티브타입스크립트
  • 오랠리
  • JS
  • TypeScript
  • git
  • react
  • frontend
  • 프론트엔드회고

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Alraffe

이것 저것 개발.

Book/Effective Typescript

Item 3. 코드 생성과 타입이 관계없음을 이해하기

2023. 2. 8. 01:15

타입스크립트 컴파일러는 두 가지의 역할을 수행한다.

  1. 구버전의 자바스크립트로 트랜스파일
  2. 타입 오류 체크 

이 둘은 독립적으로 이루어지기 때문에 타입오류가 있는 코드도 컴파일이 가능하다. 만약 오류가 있을 경우 컴파일 하지 않으려면  noEmitOnError를 설정하거나 빌드 도구에 적용하면 된다.

 

런타임에는 타입체크가 불가능하다. 따라서 instanceof와 같이 런타임에 체크가 일어나는 경우 타입체크를 정상적으로 할 수 없다.

이러한 문제를 해결할 수 있는 방법은

 

  1. 런타임에도 타입 정보를 체크할 수 있도록 코드 작성

function caculateArea(Shape){
	if('height' in shape){
    shape; //타입이 Rectangle
    return shape.width * shape.height;
    }else{
    shape; // 타입이 Square
    return shape.width * shape.width;
    }
}

 

 

  2. 태그 기법

interface Square{
	kind: 'square';
	width: number;
}
interface Rectangle{
    kind: 'rectangle';
    height: number;
    width : number;
}
type Shape = Square | Rectangle;

function caculateArea(Shape){
	if(shape.kind === 'rectangle'){
    shape; //타입이 Rectangle
    return shape.width * shape.height;
    }else{
    shape; // 타입이 Square
    return shape.width * shape.width;
    }
}

 

 

  3. 타입을 클래스로 선언하기

 클래스로 만들면 타입과 값을 둘 다 사용할 수 있다. 즉, 런타임에 접근 불가한 타입과 런타임에도 접근 가능한 값을 사용해 오류를 없애는 것이다.

 

class Square {
  constructor(public width: number) {}
}
class Rectangle extends Square {
  constructor(public width: number, public height: number) {
    super(width);
  }
}
type Shape = Square | Rectangle;

function calculateArea(shape: Shape) {
  if (shape instanceof Rectangle) {
    shape;  // Type is Rectangle
    return shape.width * shape.height;
  } else {
    shape;  // Type is Square
    return shape.width * shape.width;  // OK
  }
}

 

 

타입 연산은 런타임에 영향을 주지 않는다.

컴파일된 아래 코드를 보면 as number 부분인 타입을 연산하는 부분은 제거된다.

function asNumber(val: number | string): number {
  return val as number;
}

 

타입은 런타임 성능에 영향을 주지 않는다.

이것은 자바스크립트 파일로 변환하는 시점에 타입, 타입 연산자는 제거되기 때문! 하지만 빌드과정에서는 오버헤드가 있다.

 

더보기

제목 : 이펙티브 타입스크립트 : 동작 원리의 이해와 구체적인 조언 62가지

출판사 : 오랠리

지은이 : 댄 밴더캄

발행 : 2쇄 21년 11월 4일

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

'Book > Effective Typescript' 카테고리의 다른 글

Item 6. 편집기를 사용하여 타입 시스템 탐색하기  (0) 2023.02.08
Item 5. any 타입 지양하기  (0) 2023.02.08
Item 2. 타입스크립트 설정 이해하기  (0) 2023.02.08
Item 1. 타입스크립트와 자바스크립트의 관계 이해하기  (0) 2023.02.08
    'Book/Effective Typescript' 카테고리의 다른 글
    • Item 6. 편집기를 사용하여 타입 시스템 탐색하기
    • Item 5. any 타입 지양하기
    • Item 2. 타입스크립트 설정 이해하기
    • Item 1. 타입스크립트와 자바스크립트의 관계 이해하기
    Alraffe
    Alraffe

    티스토리툴바