Skip to content

Latest commit

 

History

History
147 lines (102 loc) · 6.92 KB

02_타입스크립트 3000미터 상공에서 내려다보기.md

File metadata and controls

147 lines (102 loc) · 6.92 KB

2장 타입스크립트 3000미터 상공에서 내려다보기


2.1 컴파일러

프로그램 실행 개요

  1. 프로그램이 AST로 파싱된다.

    • 프로그램은 프로그래머가 작성한 다수의 텍스트 파일로 구성.
    • 이 텍스트를 컴파일러(compiler)라는 특별한 프로그램이 파싱하여 추상 문법 트리(abstract syntax tree, AST)라는 자료구조로 변환. (AST는 공백, 주석, 탭 등의 결과를 무시)
  2. AST가 바이트 코드로 컴파일된다.

    • AST를 바이트코드(bytecode)라는 하위 수준의 표현으로 변환.
  3. 런타임이 바이트코드를 평가한다.

    • 바이트코드가 만들어졌으면 런타임(runtime)이라는 다른 프로그램에 바이트코드를 입력해 평가하고 결과를 얻음.

타입스크립트 컴파일과정

타입스크립트가 다른 언어와 다른 점은 컴파일러가 코드를 바이트코드 대신 자바스크립트 코드로 변환한다는 점.

TS (TSC)
  1. 타입스크립트 소스 -> 타입스크립트 AST
  2. 타입 검사기가 AST를 확인 *
  3. 타입스크립트 AST -> 자바스크립트 소스

JS (브라우저, NodeJS, 기타엔진)
  4. 자바스크립트 소스 -> 자바스크립트 AST
  5. AST -> 바이트코드
  6. 런타임이 바이트코드를 평가
  • TSC가 타입스크립트 코드를 자바스크립트 코드로 컴파일할 때는 개발자가 사용한 타입을 확인하지 않는다.
  • 개발자가 코드에 기입한 타입 정보는 최종적으로 만들어지는 프로그램에 아무런 영향을 주지 않는다.
  • 따라서 타입을 바꾸고 개선하고 실험해도 기존의 프로그램이 망가질 염려가 없다.

2-2 타입시스템

타입 시스템은 보통 두 가지 종류가 있다.

  1. 명시적 타입 시스템
  2. 자동 타입 추론 시스템
  • 타입스크립트는 두 가지 시스템에 영향을 받아 두 방식 중 선택할 수 있다.

  • 어노테이션(:)을 이용하면 타입스크립트에 명시적으로 타입을 지정할 수 있다.

  • 어노테이션을 사용하지 않으면 타입스크립트가 알아서 타입을 추론한다.

    타입스크립트가 타입을 추론하도록 두는 것이 코드를 줄일 수 있는 방법이므로 보통 어노테이션은 생략한다.

2-2-1 타입스크립트 vs. 자바스크립트

타입 시스템 기능 자바스크립트 타입스크립트
타입 결정 방식 동적 정적
타입 자동 변환 O X (대부분)
타입 확인 시기 런타임 컴파일 타임
에러 검출 시기 런타임 (대부분) 컴파일 타임 (대부분)

타입은 어떻게 결정되는가?

  • 동적 타입 바인딩(dynamic type binding)을 하는 자바스크립트는 프로그램을 실행해야만 특정 데이터의 타입을 알 수 있다.
  • 타입스크립트는 점진적으로 타입을 확인하는(gradually typed) 언어다.
    • 즉, 타입스크립트는 컴파일 타임에 프로그램의 모든 타입을 알고 있을 때 최상의 결과를 보여줄 수 있지만, 프로그램을 컴파일하는 데 반드시 모든 타입을 알아야 하는 것은 아니다.
    • 타입을 지정하지 않은 프로그램이라도 그중 일부 타입을 추론해서 오류를 검출할 수 있지만, 모든 타입을 알지 못하는 상황에서는 많은 오류가 사용자에게 그대로 노출될 수 있다.
    • 점진적 타입 확인은 타입을 지정하지 않은 기존 자바스크립트 콛드를 타입을 사용하는 타입스크립트로 마이그레이션 할 때 특히 유용하다.
    • 코드를 마이그레이션하는 상황이 아니라면 모든 코드의 타입을 컴파일 타임에 지정하는 것을 목표로 해야한다.

자동으로 타입이 변환되는가?

  • 자바스크립트는 약한 타입(weakly typed) 언어다. 유효하지 않는 연산을 수행하면 다양한 규칙을 적용해가며 개발자가 의도한 바를 알아내려 노력하고, 주어진 정보로 최상의 결과를 도출한다.
  • 타입스크립트는 유효하지 않은 연산을 수행하면 바로 그 부분을 지적하며, 의도를 명시해야 타입스크립트의 지적을 무사히 통과할 수 있다.

언제 타입을 검사하는가?

  • 자바스크립트는 대부분 상황에서 타입이 무엇인지 따지지 않는다.

  • 타입스크립트는 컴파일 타임에 코드의 타입을 확인하기 때문에 코드를 실행하지 않고도 에러가 있음을 바로 알 수 있다.

    3 + [1];
    // [ts] Operator '+' cannot be applied to types '3' and 'number[]. [2365]

에러는 언제 검출되는가?

  • 자바스크립트는 런타임에 예외를 던지거나 암묵적 형변환을 수행한다.

    참고로 자바스크립트도 프로그램을 파싱하기 때문에 실행 전에 문법 에러와 몇 가지 선택 버그(예: 한 영역에 같은 이름으로 여러 const를 선언) 등을 검출 할 수 있다.
    (바벨(Babel) 같은 도구를 이용하여) 빌드 프로세스에 자바스크립트 파싱 과정을 포함시키면 빌드 타임에 이런 에러를 찾아낼 수 있다.

  • 타입스크립트는 컴파일 타임에 문법 에러와 타입 관련 에러를 모두 검출한다.

2-3 코드 편집기 설정

2-3-1 tsconfig.json

아래와 같이 직접 만들수도 있고 타입스크립트 내장명령어 tsc --init 타입스크립트 프로젝트를 자동으로 설정할 수 있다.

// 예시
{
  "compilerOptions": {
    "lib": ["ES6", "dom"],
    "module": "commonJs",
    "outDir": "dist",
    "sourceMap": true,
    "strict": true,
    "target": "ES6"
  },
  "include": ["src"]
}

2-3-2 tslint.json

tslint --init 명령어는 기본값으로 채워진 tslint.json 파일을 만든다.

빠르게 프로젝트를 설정하기 위한 방법들

  • ts-node를 설치한다. 이를 이용하면 명령 한 번으로 타입스크립트를 컴파일하고 실행
  • typescript-node-starter 같은 뼈대(scafolding) 제공 도구를 이용해 프로젝트 디렉터리 구조를 빠르게 생성