TypeScript란? 설치와 tsc 첫 컴파일
왜 타입을 더하는지·설치·첫 .ts 파일·tsconfig 최소 설정까지. 20편 교재의 시작.
TypeScript 는 자바스크립트(JS) 에 타입을 더한 언어입니다. 같은 코드, 같은 실행, 단 한 가지가 다릅니다 — 코드를 쓸 때 "이 변수가 숫자인지 문자열인지 정해놓고 가는 것". 처음에는 귀찮아 보이지만, 코드가 1만 줄을 넘어가는 순간 TS 가 없으면 죽습니다. 1편은 "왜 TS 가 필요한지" 부터 "내 컴퓨터에서 첫 컴파일을 돌려보기"까지 천천히 갑니다.
읽기 전 권장. 자바스크립트 교재 1~13편(또는 동등한 수준의 JS 지식) 을 먼저 익히고 오면 이 시리즈를 훨씬 편하게 따라올 수 있습니다. TS 는 JS "위에" 쌓는 언어라, 바닥이 흔들리면 위가 무너집니다.
왜 TypeScript 인가 — JS 에 타입이 왜 필요할까
JS 에서는 이런 코드가 그대로 실행됩니다.
function add(a, b) {
return a + b;
}
console.log(add(1, 2)); // 3
console.log(add("1", "2")); // "12" ← 문자열 합치기로 동작
console.log(add(1, "2")); // "12" ← 의도와 다른 결과
console.log(add(1)); // NaN ← 두 번째 인자 안 줘도 통과
네 줄 모두 에러 없이 실행됩니다. 문제는 의도와 결과가 다를 때 디버깅에서 발견되거나, 더 나쁘면 사용자에게 노출되어서야 발견된다는 것. TS 는 같은 함수를 이렇게 씁니다.
function add(a: number, b: number): number {
return a + b;
}
add(1, 2); // OK → 3
add("1", "2"); // ❌ Argument of type 'string' is not assignable to 'number'
add(1, "2"); // ❌ 같은 이유로 컴파일 단계에서 차단
add(1); // ❌ Expected 2 arguments, but got 1
"실행 전" 에 에러가 나옵니다. 빨간 줄이 VS Code 에 그어지고, 빌드 단계에서 차단됩니다 — 즉 사용자가 만나기 전에 우리가 먼저 만납니다. 이게 TS 의 핵심 가치입니다.
설치 — Node + tsc
TS 자체는 Node.js 위에서 도는 명령행 도구(tsc — TypeScript Compiler) 형태로 옵니다. 그래서 두 단계로 설치합니다.
- Node.js LTS 가 설치돼 있어야 합니다 (JS 교재 1편 참고 — Windows·macOS·우분투 OS 별 5분).
- 그 위에 TypeScript 패키지를 npm 으로 설치.
전역 설치 (시스템 어디서나 tsc)
# 어디서나 tsc 명령을 쓰고 싶을 때
npm install -g typescript
tsc --version
# 예: Version 5.6.3
프로젝트 단위 설치 (권장)
실무에서는 프로젝트마다 TS 버전을 고정합니다. 협업자가 같은 버전을 쓰게 하기 위해서요.
mkdir my-ts-project && cd my-ts-project
npm init -y # package.json 생성
npm install --save-dev typescript
# 실행은 npx 로
npx tsc --version
tip. 신규 프로젝트는 거의 항상 "프로젝트 단위 설치 + npx" 가 정답입니다. 전역 tsc 와 프로젝트의 tsc 버전이 다르면 미묘한 버그가 납니다. --save-dev 는 "개발 의존성" 이라는 표시.
첫 .ts 파일 — tsc 로 컴파일하기
hello.ts 파일을 만들고 다음 한 줄을 넣습니다.
// hello.ts
const greeting: string = "Hello, TypeScript!";
console.log(greeting);
이제 컴파일합니다. TS 는 브라우저나 Node 가 직접 실행하지 못합니다 — 먼저 JS 로 바꿔야 합니다. 그 변환을 컴파일(혹은 트랜스파일) 이라고 부릅니다.
npx tsc hello.ts
# 이 명령으로 같은 폴더에 hello.js 가 생깁니다.
node hello.js
# 출력: Hello, TypeScript!
한 번 hello.js 안을 열어보세요. 타입 표기(: string) 가 지워지고 순수 JS 만 남아 있습니다. TS 의 타입은 실행 시간에는 사라지는 "쓰는 동안에만" 도와주는 라벨이라는 걸 기억하세요.
tsconfig.json — 최소 설정 5줄
파일이 늘어나면 npx tsc hello.ts 처럼 매번 파일명을 적기 귀찮아집니다. tsconfig.json 을 한 번 만들어두면 npx tsc 만 쳐도 프로젝트 전체가 컴파일됩니다.
npx tsc --init
# tsconfig.json 이 100줄 가까운 주석과 함께 생성됩니다
처음에는 다음 5줄짜리 최소 설정으로 시작해도 충분합니다.
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"strict": true,
"outDir": "dist"
},
"include": ["src/**/*"]
}
| 옵션 | 의미 | 처음에 왜 이 값 |
|---|---|---|
| target | 컴파일된 JS 의 문법 버전 | ES2022 — 모던 Node·브라우저에서 잘 돌고 화살표·async 그대로 |
| module | import/export 변환 방식 | ESNext — 현대적 ESM 그대로 두기 |
| moduleResolution | import 경로 찾는 규칙 | Bundler — 최신 esbuild/vite 와 호환 |
| strict | 엄격한 타입 검사 한 묶음 | true — TS 의 진가는 strict 켜야 나옵니다 (10·18편에서 자세히) |
| outDir | JS 출력 위치 | dist — src/ 와 분리해 깔끔하게 |
이제 src/hello.ts 를 만들고 npx tsc 만 치면 dist/hello.js 가 생깁니다.
교재 20편 로드맵
| 파트 | 편수 | 주제 | 끝나면 |
|---|---|---|---|
| Part 1 입문 | 1~4 | 설치·기본 타입·함수·객체 | 간단한 함수에 타입 붙이기 |
| Part 2 기초 | 5~10 | 유니온·제네릭·enum·클래스·모듈·tsconfig | 중간 규모 프로젝트 구조 잡기 |
| Part 3 중급 | 11~15 | 유틸리티·조건부·매핑·타입 가드·비동기 | 라이브러리 타입 자신 있게 읽기 |
| Part 4 고급 | 16~20 | 데코레이터·.d.ts·strict 옵션·빌드·실전 패턴 | 팀에 타입 가이드 제안 가능 |
2편 — 기본 타입 7가지
string·number·boolean·array·tuple·any·unknown — 각 타입의 용도, 추론이 알아서 해주는 것과 직접 적어야 하는 것의 경계.
현재: 1편 (입문) · 다음 → 2편 기본 타입 · 진행: 1/20