TypeScript
개요
TypeScript는 정적 타입 시스템을 위에 얹은 JavaScript입니다. 일반 JavaScript로 컴파일되므로 JS가 실행되는 곳이라면 어디서든(브라우저, Node, Deno, Bun, 엣지 런타임) 실행되며, 코드가 실행되기도 전에 통째로 한 부류의 버그를 잡아냅니다.
강점
- 정적 타입이 오타, null 실수, 형태 불일치를 컴파일 시점에 잡아냅니다.
- 뛰어난 에디터 경험: 자동완성, 인라인 문서, 안전한 리팩터링.
- 점진적 도입 — 원하는 만큼 타입을 많게도 적게도 붙일 수 있습니다.
- 프론트엔드와 백엔드에 걸쳐 동일한 언어이며, 거대한 npm 생태계를 갖췄습니다.
트레이드오프
- 빌드/컴파일 단계와 설정할
tsconfig.json이 필요합니다. - 타입 시스템은 진짜로 복잡해질(제네릭, 조건부 타입) 만큼 강력해서 시간을 잡아먹을 수 있습니다.
- 타입은 런타임에 지워지므로, 신뢰할 수 없는 입력에 대해서는 여전히 런타임 검증(예: Zod)이 필요합니다.
- 번들러와 런타임에 걸친 설정 및 툴링의 잦은 변화.
언제 선택하나
여러 기여자가 있거나 수명이 긴 비자명한 JavaScript 프로젝트라면 TypeScript를 선택하세요. 현대적인 웹 앱(React, Next.js, SvelteKit), Node/엣지 백엔드, 그리고 리팩터링 안전성이 중요한 모든 것에 대한 기본 선택입니다.
바이브 코딩 적합성
AI 어시스턴트는 TypeScript에서 빛을 발합니다. 타입 체커가 어시스턴트와 당신 모두에게 빠른 피드백 루프를 주기 때문입니다. 컴파일 오류를 다시 붙여넣으면 모델이 보통 깔끔하게 고쳐냅니다. any 대신 정확한 타입을 요청하고, 신뢰 경계(API 입력, 환경 변수)에서 런타임 검증을 요구해 AI를 이끄세요. 생성되는 import와 설정이 일치하도록 사용하는 런타임과 프레임워크 버전을 명시적으로 알려주세요. 타입이 까다로워지면 무작정 넓히지(widening) 말고, 추론된 타입을 설명해 달라고 모델에게 요청하세요.
type User = { id: number; name: string; email?: string };
function greet(user: User): string {
return `Hi ${user.name}` + (user.email ? ` <${user.email}>` : "");
}
console.log(greet({ id: 1, name: "Ada" }));