TypeScript

TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.

마이크로소프트(Microsoft) 공식 소개 문구

안전벨트와 에어백을 장착한 JavaScript, 또는 컴파일러와 매일 눈싸움을 벌여야 하는 애증의 언어. 결국 런타임에는 다 지워져 버릴 타입 지정을 위해 개발자들의 영혼과 빌드 서버의 CPU를 등가교환하는 언어

1. 개요

TypeScript마이크로소프트의 아네르스 하일스베르(Anders Hejlsberg)가 개발한 오픈 소스 프로그래밍 언어이다. 동적 타이핑 언어인 JavaScript의 한계를 극복하기 위해 정적 타입(Static Type) 시스템을 도입한 것이 핵심이다.

동작 원리는 독특하게도 코드를 기계어로 직접 컴파일하는 것이 아니라, TypeScript 코드를 일반 JavaScript 코드로 변환(Transpile)하는 방식을 취한다. 즉, 코딩할 때만 우리를 지켜주는 보디가드이고, 실제 브라우저Node.js 런타임에 들어갈 때는 모든 타입 정보가 먼지처럼 사라진 순수 자바스크립트로 돌아간다.1

2. 주요 특징

2.1. 정적 타입과 컴파일

TypeScript의 가장 큰 존재 의의이다. 변수를 선언할 때, 함수의 매개변수와 반환값에 타입을 지정함으로써 코드 실행 전에 수많은 버그를 잡아낼 수 "있다." 예를 들어, 오타로 인해 발생할 수 있는 무수한 에러나 undefined.something 같은 치명적인 런타임 에러를 컴파일 단계에서 미리 예방할 수 있어 대규모 프로젝트의 안정성을 극적으로 끌어올린다.

2.2. 구조적 타이핑 (Structural Typing)

Java나 C#은 명시적으로 특정 클래스나 인터페이스를 상속/구현해야 호환되는 명목적 타이핑(Nominal Typing)을 사용하는 반면, TypeScript는 객체의 '실제 형태(구조)'만 같으면 같은 타입으로 인정해 주는 구조적 타이핑을 사용한다. 예를 들어 A라는 타입이 { name: string }을 필요로 할 때, 명시적으로 A를 구현하지 않았더라도 { name: "Tom", age: 20 }처럼 필요한 필드를 갖추고만 있으면 아무 군말 없이 받아들인다. 흔히 말하는 덕 타이핑(Duck Typing)의 정적 버전이라고 볼 수 있다.

2.3. 점진적 타이핑과 any의 축복

처음부터 완벽한 타입을 지정하며 코딩하기 어려운 현실을 고려하여, 타입 지정을 점진적으로 적용할 수 있도록 설계되었다. 그리고 그 중심에는 모든 타입 체크를 무력화하는 무적의 치트키 any가 존재한다. 타입을 any로 선언하는 순간, TypeScript는 해당 변수에 대해 훈수를 두는 것을 포기하고 꼬리를 내린다.

3. 관련 밈 및 드립

3.1. 갓 any와 AnyScript

TypeScript의 타입 검사가 너무 빡빡해서 코드 작성이 막히거나, 서드파티 라이브러리의 타입 지정이 꼬였을 때 많은 개발자들이 굴복하고 any를 도배한다. 이 상태가 심화되면 TypeScript가 아니라 AnyScript라고 비아냥거리는 밈이 생겼다.

"타입 에러가 안 없어진다고요? 걱정 마세요. 뒤에 as any만 붙이면 세상이 평화로워집니다."

물론 any를 남발할 거라면 굳이 빌드 시간만 늘어나는 TypeScript를 쓸 이유가 전혀 없기 때문에, 실무에서는 린터(Linter) 규칙을 통해 no-explicit-any를 강제하여 이 평화주의적 타협을 철저히 차단한다.

3.2. 빨간 줄과의 전쟁

TypeScript 개발자의 일상은 에디터에 뜨는 빨간 에러과의 전쟁이다. 특히 복잡한 제네릭(Generic)이나 조건부 타입(Conditional Types)을 다루다 보면, 웬만한 암호문 뺨치는 엄청난 길이의 에러 메시지를 보며 뇌 정지가 오는 경험을 빈번하게 하게 된다.

4. 여담

  • 창시자의 위엄: TypeScript의 설계자 아네르스 하일스베르는 Turbo Pascal, Delphi, 그리고 C#을 설계한 프로그래밍 언어 업계의 전설적인 인물이다. C#을 만들었던 사람이 TypeScript를 만들다 보니 언어 곳곳에 C#의 짙은 향기가 묻어난다.
  • 로고의 비밀: 공식 로고는 파란색 사각형 바탕에 흰색 글씨로 'TS'가 적혀 있는 단순한 형태다. JavaScript의 노란색 사각형 'JS' 로고와 보색 관계에 가까워 직관적인 대비를 이룬다.
  • 타입으로 튜링 완전 구현: TypeScript의 타입 시스템은 그 자체로 튜링 완전(Turing-complete)하다. 즉, 런타임 코드가 아닌 오직 '타입 선언'만으로 피보나치 수열을 계산하거나, 심지어 틱택토 게임을 구동하는 미친 짓(?)을 수행할 수 있다.

5. 관련 문서

각주

  1. 이를 타입 소거(Type Erasure)라고 한다. 컴파일 결과물인 .js 파일에는 인터페이스(interface), 타입 에일리어스(type), 제네릭(<>) 등의 흔적이 단 한 줄도 남지 않는다.