Typescript ( tsconfig.json )
2025. 5. 11. 14:07
728x90
반응형

Typescript

  • Microsoft에서 개발한 오픈소스 언어로, JavaScript에 정적 타입 시스템 객체지향 프로그래밍 개념을 추가한 언어입니다.
  • JavaScript의 상위 집합(Superset)으로, 정적 타입(Type System)을 추가한 프로그래밍 언어입니다.
  • 자바스크립트의 유연함은 그대로 유지하면서, 정확성과 개발 생산성을 높일 수 있게 해줍니다.

 

특징

  • 정적 타입 검사가 가능합니다.
    • 컴파일 단계에서 타입 오류를 미리 발견할 수 있어, 런타임 오류를 사전에 방지할 수 있다.
// typescript
function add(a: number, b: number): number {
  return a + b;
}

add("1", 2); // ❌ 오류 발생 (string은 number에 할당 불가)


// javascript
function add(a, b) {
  return a + b;
}

add("1", 2); // → "12" (버그가 있어도 실행됨)
  • 타입 정보가 명시되어 있으므로 VSCode 같은 IDE에서 자동완성, 타입 추론, 오류 표시가 가능합니다. 
  • 클래스, 인터페이스, 추상 클래스, 접근 제어자 등 객체지향 기능을 공식적으로 지원하뎌 객체 지향 프로그래밍이 가능합니다.
  • interface, type, namespace, module, enum 등을 통해 구조적이고 유지보수 쉬운 코드 작성 가능합니다.

 

컴파일 작동 과정

  • Parser - 코드를 분석해서 AST(Abstract Syntax Tree) 생성
    • 모든 컴파일 과정의 기준이 될 AST (추상 구문 트리)를 만들어 냅니다. Scanner, Parser 를 거쳐 AST를 생성합니다.
      • Scanner : TS로 작성된 코드 문자열들을 각각 예약어, 클론 부호 등의 토큰으로 분리시키는 역할을 수행합니다.
      • Parser : Scanner가 분리해준 토큰을 구문의 구조에 따라 Tree 구조로 만드는 역할을 수행합니다. 이 과정에서 코드가 올바른 문법인지 분석하여 구문 오류를 잡아내는 역할도 수행합니다.
  • Binder - 변수, 타입, 스코프 등 연결
    • 생성된 AST를 읽으며 타입 검사에 필요한 데이터를 수집하는 과정입니다. 각 Node 별로 identifier를 구분하고 식별자가 어느 위치에 정의되었는지, 어떤 플래그를 적용할 것인지 구분하여 Node-Symbol 형태로 만듭니다. 이 때, Symbol은 각 Node의 타입 정보를 저장하는 메타데이터 입니다.
  • Type Checker -  타입 검증 수행
    • 위에서 만들어 낸 AST와 Node-Symbol 정보들을 기준으로 타입 검사를 시행합니다.
    • 타입 검사는 구조적 타이핑 (Structural Typing) 으로 진행됩니다.
      • 구조적 타이핑 (Structural Typing) : 객체의 구조가 같다면, 같은 타입으로 간주
      • 먼저 이 값이 object 형태인지 확인하고, 다음은 필드, 마지막으로 값의 타입이 일치하는 지를 비교합니다.
  • Emitter - 타입 제거 후 JavaScript 코드 생성
    • 먼저 TS AST를 JS AST로 변환합니다. 즉, TS AST에서 타입을 나타내는 keyword syntax를 제거하는 과정입니다.
    • 그 후, tsConfig.json 설정에 따라 각 문법 버전에 맞춰 asset flag를 지정합니다. transformer은 이를 기준으로 js 코드와 타입만을 정의된 d.ts 파일을 생성합니다. 
      • d.ts 은 컴파일러를 통해 타입 추론에 사용됩니다.

 

tsConfig.json

{
  "compilerOptions": {
   	"baseUrl": ".", // 모듈 해석의 기준 경로
    "target": "ES2017", // JavaScript 버전
    "lib": ["dom", "dom.iterable", "esnext"], // TypeScript가 사용할 내장 타입 라이브러리
    "allowJs": true, // .js 파일도 컴파일 및 타입 검사 대상에 포함시킵니다.
    "skipLibCheck": true, // 외부 라이브러리 타입 검사 건너뜀 (속도 ↑)
    "strict": true,
    "noEmit": true, // TypeScript가 코드를 컴파일하지 않고, 타입 검사만 수행하도록 설정
    "esModuleInterop": true, // CommonJS 모듈을 ES6처럼 import 가능
    "module": "esnext", // 어떤 모듈 시스템 사용할지
    "moduleResolution": "bundler", // 모듈 해석 방식을 최신 번들러(예: Vite, Next.js, Webpack 5) 스타일로 지정
    "resolveJsonModule": true, // .json 파일 import 허용 여부
    "isolatedModules": true // 모든 파일을 개별 모듈로 처리하겠다는 의미
    "jsx": "preserve", // JSX 구문을 그대로 유지 (<div />)한 채로 JS로 출력
    "incremental": true, // 이전 컴파일 결과를 캐싱하여, 이후 컴파일 속도 개선
    "plugins": [
      {
        "name": "next"
      }
    ],
    "forceConsistentCasingInFileNames": true, // 파일 이름 대소문자 불일치로 인한 문제를 방지
    "removeComments": true, // 주석 제거
  },
  "include": ["src"], // 컴파일할 파일/폴더 지정
  "exclude": ["node_modules", "dist"] // 제외할 파일/폴더 지정
}
728x90
반응형

'typescript' 카테고리의 다른 글

Typescript ( CFA )  (1) 2025.05.15
Typescript ( Structural Typing )  (0) 2025.05.13
Typescript ( type vs interface )  (0) 2025.05.11