TypeScript란 무엇이며 왜 사용하는가
TypeScript(TS)는 JavaScript(JS)의 상위 집합(Superset)으로,
정적 타입 (Type) 시스템을 추가한 프로그래밍 언어입니다.
쉽게 말해, "이 변수에는 숫자만 넣을 수 있어"처럼 데이터의 종류를 미리 정해두는 것입니다.
// 런타임 (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
// 컴파일 타임 (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!
자동 완성, 리팩토링 (Refactoring, 코드 구조 개선), 코드 내비게이션이 정확하게 동작
런타임 전에 타입 에러, 오타, 잘못된 API(프로그램 간 연결 규약) 사용을 감지
타입 정의 자체가 API 문서 역할, 별도 문서 불필요
코드 변경 시 영향 범위를 컴파일러 (Compiler, 코드 변환기)가 알려줌
세계적인 기업과 오픈소스 프로젝트에서 채택
# 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
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"] // 제외할 파일
}
tsc --init 명령어로 기본 tsconfig.json을 자동 생성할 수 있습니다.
| 옵션 | 설명 | 권장값 |
|---|---|---|
strict |
모든 엄격 모드 옵션 활성화 | true |
noImplicitAny |
암시적 any 타입 금지 | true |
strictNullChecks |
null/undefined 엄격 체크 | true |
target |
출력 JS 버전 | "ES2020" |
module |
모듈 시스템 | "commonjs" |
"strict": true로 시작하세요. 나중에 켜기 어렵습니다.
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 # 컴파일 + 실행 한 번에
타입 정보는 컴파일 후 완전히 제거됩니다.
런타임에는 순수 JavaScript만 실행됩니다. (Zero Runtime Cost - 실행 시 추가 비용 없음)
변수, 매개변수 (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
};
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" (리터럴 타입)
언제 타입을 명시하고, 언제 추론에 맡길까?
// 초기값이 있는 변수
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);
}
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));
// interface -> 완전히 제거됨
function greet(user) {
return `Hi, ${user.name}!`;
}
const user = {
name: "Kim",
age: 25
};
console.log(greet(user));
타입 정보는 개발 시에만 존재하고, 런타임 JS에는 흔적이 없습니다.
| 개념 | 설명 |
|---|---|
| TypeScript | JavaScript + 정적 타입 시스템 |
| 컴파일 | .ts → .js (타입 제거됨) |
| tsconfig.json | 프로젝트 컴파일 옵션 설정 |
| 타입 어노테이션 | let x: type = value |
| 타입 추론 | 초기값으로 자동 타입 결정 |
| strict 모드 | 항상 true로 시작! |