Chapter 01

TypeScript 소개

TypeScript란 무엇이며 왜 사용하는가


← 목차로 돌아가기

TypeScript란?

핵심 정의

TypeScript(TS)는 JavaScript(JS)의 상위 집합(Superset)으로,
정적 타입 (Type) 시스템을 추가한 프로그래밍 언어입니다.

쉽게 말해, "이 변수에는 숫자만 넣을 수 있어"처럼 데이터의 종류를 미리 정해두는 것입니다.

  • Microsoft에서 2012년에 개발
  • 모든 JavaScript 코드는 유효한 TypeScript 코드
  • 컴파일 (Compile, 코드를 변환하는 과정) 시 순수 JavaScript로 변환
  • 현재 가장 인기 있는 프로그래밍 언어 중 하나

JavaScript와의 관계

TypeScript
JavaScript
ES6+ 모든 기능
TypeScript = JavaScript +
+ 타입 시스템
+ 인터페이스 (Interface)
+ 제네릭 (Generic)
+ 열거형 (Enum)
+ 데코레이터 (Decorator)

왜 TypeScript를 사용하는가?

JavaScript의 문제점

// 런타임 (Runtime, 프로그램 실행 중)에서야 에러 발견
function add(a, b) {
  return a + b;
}

add(1, "2");      // "12" (의도치 않은 결과)
add(1);           // NaN
add(1, 2, 3, 4);  // 3 (나머지 무시)

// 오타도 잡아내지 못함
const user = { name: "Kim" };
console.log(user.naem); // undefined

TypeScript의 해결책

// 컴파일 타임 (Compile Time, 코드를 변환하는 시점)에 에러 감지
function add(a: number, b: number): number {
  return a + b;
}

add(1, "2");      // Error!
add(1);           // Error!
add(1, 2, 3, 4);  // Error!

// 오타를 즉시 감지
const user = { name: "Kim" };
console.log(user.naem); // Error!

TypeScript의 이점

IDE 지원 강화

자동 완성, 리팩토링 (Refactoring, 코드 구조 개선), 코드 내비게이션이 정확하게 동작

버그 조기 발견

런타임 전에 타입 에러, 오타, 잘못된 API(프로그램 간 연결 규약) 사용을 감지

살아있는 문서화

타입 정의 자체가 API 문서 역할, 별도 문서 불필요

안전한 리팩토링

코드 변경 시 영향 범위를 컴파일러 (Compiler, 코드 변환기)가 알려줌

TypeScript를 사용하는 프로젝트

세계적인 기업과 오픈소스 프로젝트에서 채택


Angular React (타입 지원) Vue 3 Next.js NestJS Deno VS Code Slack Figma Stripe Airbnb Vercel

Tip: 2024 Stack Overflow 설문에서 TypeScript는 가장 사랑받는 언어 Top 5에 선정되었습니다.

TypeScript 설치하기

전역 설치

# npm으로 전역 설치
npm install -g typescript

# 설치 확인
tsc --version   # Version 5.x.x

프로젝트별 설치 (권장)

# 프로젝트 초기화
mkdir my-ts-project && cd my-ts-project
npm init -y

# 개발 의존성으로 설치
npm install --save-dev typescript

# ts-node도 함께 설치 (직접 실행용)
npm install --save-dev ts-node

tsconfig.json

TypeScript 프로젝트의 설정 파일

{
  "compilerOptions": {
    "target": "ES2020",          // 컴파일 대상 JS 버전
    "module": "commonjs",        // 모듈 (Module) 시스템
    "strict": true,              // 엄격한 타입 체크
    "esModuleInterop": true,     // ES 모듈 호환성
    "outDir": "./dist",          // 출력 디렉토리
    "rootDir": "./src",          // 소스 디렉토리
    "declaration": true,         // .d.ts 파일 생성
    "sourceMap": true            // 소스맵 생성
  },
  "include": ["src/**/*"],       // 포함할 파일
  "exclude": ["node_modules"]    // 제외할 파일
}
Tip: tsc --init 명령어로 기본 tsconfig.json을 자동 생성할 수 있습니다.

주요 tsconfig 옵션

옵션 설명 권장값
strict 모든 엄격 모드 옵션 활성화 true
noImplicitAny 암시적 any 타입 금지 true
strictNullChecks null/undefined 엄격 체크 true
target 출력 JS 버전 "ES2020"
module 모듈 시스템 "commonjs"
Warning: 새 프로젝트는 반드시 "strict": true로 시작하세요. 나중에 켜기 어렵습니다.

첫 번째 TypeScript 프로그램

hello.ts

// hello.ts
function greet(name: string): string {
  return `안녕하세요, ${name}님! TypeScript에 오신 것을 환영합니다.`;
}

const message: string = greet("홍길동");
console.log(message);

// 타입 에러 예시 (주석 해제하면 컴파일 에러)
// greet(42);        // Error: Argument of type 'number'
                     // is not assignable to parameter of type 'string'

실행 방법

# 방법 1: 컴파일 후 실행
tsc hello.ts          # hello.js 생성
node hello.js         # 실행

# 방법 2: ts-node으로 직접 실행 (개발용)
npx ts-node hello.ts  # 컴파일 + 실행 한 번에

TypeScript 컴파일 과정

.ts 파일
TypeScript 코드
tsc 컴파일러
타입 검사 + 변환
.js 파일
순수 JavaScript

핵심 포인트

타입 정보는 컴파일 후 완전히 제거됩니다.
런타임에는 순수 JavaScript만 실행됩니다. (Zero Runtime Cost - 실행 시 추가 비용 없음)

타입 어노테이션 (Type Annotation) 기초

변수, 매개변수 (Parameter), 반환값에 타입을 명시적으로 지정합니다.
어노테이션이란 "주석을 달다"라는 뜻으로, 변수 옆에 : 타입을 붙여서 "이 변수는 이 타입이야"라고 표시하는 것입니다.

// 변수 타입 어노테이션: 변수명 뒤에 ": 타입"을 붙임
let name: string = "김철수";  // name에는 문자열만 넣을 수 있음
let age: number = 25;          // age에는 숫자만 넣을 수 있음
let isStudent: boolean = true; // isStudent에는 true/false만 넣을 수 있음

// 배열 타입: 타입 뒤에 []를 붙임
let scores: number[] = [90, 85, 92];  // 숫자만 들어가는 배열
let names: string[] = ["Alice", "Bob"]; // 문자열만 들어가는 배열

// 함수 매개변수와 반환 타입: (매개변수: 타입): 반환타입
function multiply(x: number, y: number): number {
  return x * y;  // 숫자 두 개를 받아서 숫자를 반환
}

// 객체 타입: { 속성명: 타입 } 형태로 정의
let user: { name: string; age: number } = {
  name: "이영희",
  age: 30
};

타입 추론 (Type Inference)

핵심 개념

TypeScript는 초기값을 기반으로 타입을 자동 추론합니다.
모든 곳에 타입을 명시할 필요가 없습니다!

// 타입 추론 - TypeScript가 자동으로 타입을 결정
let message = "Hello";    // string으로 추론
let count = 42;           // number로 추론
let active = true;        // boolean으로 추론

// 함수 반환 타입도 추론
function add(a: number, b: number) {
  return a + b;           // 반환 타입: number로 추론
}

// 배열 타입 추론
let numbers = [1, 2, 3];     // number[]로 추론
let mixed = [1, "hello"];    // (string | number)[]로 추론

// const는 더 좁은 타입으로 추론
const PI = 3.14;             // 타입: 3.14 (리터럴 (Literal) 타입 - 정확히 그 값만 허용)
const greeting = "hello";    // 타입: "hello" (리터럴 타입)

명시적 타입 vs 타입 추론

언제 타입을 명시하고, 언제 추론에 맡길까?

추론에 맡기기 (권장)

// 초기값이 있는 변수
let name = "Kim";
let age = 25;

// 간단한 함수 반환
function double(n: number) {
  return n * 2; // number 추론
}

명시적 타입 (권장)

// 함수 매개변수
function greet(name: string) { }

// 초기값 없는 변수
let result: number;

// 복잡한 반환 타입
function parse(s: string): User {
  return JSON.parse(s);
}
Best Practice: 추론이 충분히 정확하면 생략하세요. 코드가 더 간결해집니다.

컴파일 전후 비교

TypeScript (.ts)

interface User {
  name: string;
  age: number;
}

function greet(user: User): string {
  return `Hi, ${user.name}!`;
}

const user: User = {
  name: "Kim",
  age: 25
};

console.log(greet(user));

JavaScript (.js)

// interface -> 완전히 제거됨



function greet(user) {
  return `Hi, ${user.name}!`;
}

const user = {
  name: "Kim",
  age: 25
};

console.log(greet(user));

타입 정보는 개발 시에만 존재하고, 런타임 JS에는 흔적이 없습니다.

Chapter 1 정리

개념 설명
TypeScript JavaScript + 정적 타입 시스템
컴파일 .ts → .js (타입 제거됨)
tsconfig.json 프로젝트 컴파일 옵션 설정
타입 어노테이션 let x: type = value
타입 추론 초기값으로 자동 타입 결정
strict 모드 항상 true로 시작!
다음 챕터 예고: 기본 타입(string, number, boolean, 열거형, 튜플 (Tuple) 등)을 깊이 있게 학습합니다.
Next

수고하셨습니다!


다음 챕터: 기본 타입 →


← 목차로 돌아가기