타입스크립트는 2012년에 마이크로소프트의 개발자이자 C#의 창시자
로도 알려진 개발자 Anders Hejlsberg(앤더스 하일스버그)에 의해 탄생했다.
타입스크립트는 오픈소스
로 공개되어 있기 때문에 많은 프로그래머들이 개발 및 유지 보수에 참여하고 있다.
또한, 작년 설문 결과에 따르면 100명의 자바스크립트 개발자들 중에 89명
이 타입스크립트를 사용하고 있을 정도로 인기가 많다고 한다. 😲
타입스크립트는
자바스크립트의 확장판
으로, 기존의 자바스크립트를 좀 더 안전하게 사용할 수 있도록 타입과 관련된 기능들을 추가한 언어이다.
따라서 문법 자체는 자바스크립트와 크게 다르지 않지만, 자바스크립트와는 달리 타입을 미리 지정
해준다는 차이점이 있다.
javascript
let a = 1;
let b = 2;
console.log(a+b); // 3
typescript
// 변수에 숫자 타입을 미리 지정해준다.
let a:number = 1;
let b:number = 2;
console.log(a+b); // 3
정답은 자바스크립트가 너무 잘나가기 때문이다!
원래 자바스크립트는 웹 브라우저에서 아주 간단한 상호작용을 처리하기 위해 만들어졌기 때문에 문법을 엄격히 갖출 필요가 없었다.
따라서 자유로운 문법 덕분에 작성하기 편리하지만 그 대가로 버그가 발생할 가능성이 높다는 단점이 있다.
그러다가 Node.js
가 등장한다.
Node.js는 자바스크립트의 실행 환경(런타임)으로, 덕분에 자바스크립트를 웹 브라우저 뿐만 아니라 어디서든 실행할 수 있게 되었다.
이는 자바스크립트를 활용해 어떤 프로그램이든 만들 수 있다는 뜻으로, 자바스크립트를 사용하는 개발자들이 웹 서버
, 모바일 어플리케이션
, 데스크탑 어플리케이션
등의 다양한 프로그램들을 만들 수 있게 되었다.
이렇게 복잡한 대규모 어플리케이션을 자바스크립트로 개발하다 보니 자바스크립트의 자유로운 문법이 문제가 되기 시작했다. 문법의 유연함이 프로그램의 안정성
을 떨어뜨리는 단점이 되어 버리기 시작한 것이다.
따라서 자바스크립트의 기존 문법들은 유지하되 안정성만 추가로 확보한 새로운 언어가 필요해졌고, 이 때문에 타입스크립트
가 나타나게 되었다.
요약하자면, 자바스크립트가 다양한 곳에서 쓰이게 되면서 이를 좀 더 안정적으로 사용하기 위해 만들어진 것이 타입스크립트이다!
자바스크립트의 한계에 대해 이해하고 타입스크립트를 잘 배우기 위해서는 먼저 타입 시스템
에 대해 알아야 한다.
모든 프로그래밍 언어에는 타입 시스템
이라는게 존재한다.
타입 시스템은 프로그래밍 언어를 사용할 때
타입과 관련해서 지켜야 하는 규칙
들을 모아둔 문법 체계이다.
타입 시스템은 정적 타입 시스템
과 동적 타입 시스템
으로 나눌 수 있다.
이러한 특징은 하나의 변수에 다양한 타입의 값을 넣어 활용할 수 있다는 장점을 갖지만 큰 단점도 갖고 있다.
아래처럼 a에 문자열을 할당한 후, 숫자를 재할당하고 이를 대문자로 바꿔주는 메서드를 사용하면 오류가 발생한다.(숫자를 대문자로 바꾸려고 했기 때문)
let a = 'hello';
a = 1214123
a.toUpperCase();
여기서 중요한 점은 이 코드가 실행이 되어
오류가 발생했다는 점이다.
이렇게 오류가 발생할 코드가 있을 때 실행 전
(= 런타임 이전)에 검사를 거쳐서 실행하지 못하도록 사전에 막는 것이 좋다.
만약 코드가 더 복잡해지는 경우에는 저런 오류가 실행과 동시에 발생하지 않고 나중에 돌발적으로 발생할 수 있는데, 이 때문에 예상치 못하게 프로그램이 강제 종료되고 서비스가 마비되는 문제가 발생할 수 있기 때문이다.
동적 타입 시스템과는 반대로 변수를 선언 함과 동시에 타입도 함께 명시를 해주기 때문에 앞서 살펴본 문제는 잘 발생하지 않는다.
정적 타입 시스템 언어 중 하나인 Java를 사용하면 아래처럼 문법에 오류가 있으면 코드를 실행시키기 이전에 에디터에서 문제를 지적해준다.
따라서 오류를 사전에 확인할 수 있다는 장점이 있다.
반면에 정적 타입 시스템 언어들에서는 모든 변수에 일일히 타입을 다 정의해야 하기 때문에 매우 귀찮으며 코드량이 늘어난다는 단점이 있다.
타입스크립트는 각 타입 시스템의 장점을 혼합
한 독특한 타입 시스템을 사용한다.
정적 타입 시스템의 장점 가져오기
타입스크립트에서는 정적 타입 시스템처럼 코드 실행 전에 변수의 타입을 결정하고 코드 오류를 검사한다.
동적 타입 시스템의 장점 가져오기
모든 변수에 일일이 타입을 명시하지 않아도 변수에 담기는 초기값을 기준으로 자동으로 타입을 추론해준다.
이런 타입 시스템을 "점진적으로 타입을 결정한다" 라고 해서
점진적 타입 시스템
(Gradual Type System)이라고 부른다.
타입스크립트의 동작 방식을 이해하기 위해 대다수의 프로그래밍 언어
들이 어떻게 동작 하는지를 먼저 살펴볼 필요가 있다.
대부분의 프로그래밍 언어는 컴퓨터보단 인간에게 더 친화적이다.
사람이 프로그래밍 언어로 코드를 작성하면 컴퓨터는 이를 컴퓨터가 이해하기 쉬운 언어로 변환하는데, 이를 컴파일
이라 한다. 코드를 컴파일하면 코드가 기계어 같은 형태로 변환되고 컴퓨터가 이를 읽어서 실행한다.
자바나 자바스크립트같은 언어를 컴파일하면 바이트 코드
라는 형식으로 변환된다.
컴파일러는 사람이 작성한 코드를 바로 바이트 코드로 변환하는게 아니라 그 전에 AST
(추상 문법 트리)라는 형태로 먼저 변환한다.
추상 문법 트리는 트리 형태의 자료구조에 코드를 쪼개서 저장 해 놓은 형태를 말한다.
코드가 실행되는 과정을 정리하자면, 컴파일러가 코드를 AST
로 변환하고 이를 다시 바이트 코드
로 변환하고 이렇게 변환된 코드를 컴퓨터가 실행하게 된다.
실습용 폴더 만들기
Node.js 패키지 초기화하기
npm init
npm i @types/node
타입스크립트는 타입이 선언되지 않은 코드를 만나면 오류를 발생시킨다. 따라서 Node.js의 기본 기능들을 위한 타입을 별도로 선언하기 위해 @types/node 패키지를 꼭 설치해야 한다.
sudo npm i -g typescript
tsc -v
console.log("Hello TypeScript");
const a: number = 1;
⭐️ 타입스크립트 파일의 확장자는
ts
이다.
tsc src/index.ts
컴파일이 완료되면 아래와 같이 자바스크립트 파일이 생성된다.
console.log("Hello TypeScript");
var a = 1;
node src/index.js
ts-node를 이용하면 명령어 한 번으로 타입스크립트 코드를 바로 실행시킬 수 있다.
sudo npm i -g ts-node
ts-node -v
ts-node src/index.ts
컴파일러는 작성한 코드에 타입 오류가 없는지 검사하고 오류가 없다면 자바스크립트 코드로 변환한다.
이러한 컴파일의 세부적인 사항들(ex. 얼마나 엄격하게 타입 오류를 검사할지, 컴파일 결과 생성되는 자바스크립트 코드의 버전은 어떻게 할 지)을 컴파일러 옵션
이라고 한다.
타입스크립트는 다른 언어에 비해 컴파일러 옵션을 아주 자유롭고 쉽게 설정할 수 있다.
타입스크립트의 컴파일러 옵션은 패키지 루트 폴더 아래에 tsconfig.json
이라는 파일에 설정할 수 있다.
컴파일러 옵션을 설정하는 가장 쉽고 빠른 방법은 자동 생성 도구
를 이용하는 방법이다. tsc를 이용하면 기본 옵션이 설정된 컴파일러 옵션 파일을 자동 생성할 수 있다.
아래 명령어를 입력하면 자동으로 기본 설정이 완료된 tsconfig.json 파일이 생성된다.
tsc --init
컴파일 할 타입스크립트 파일의 범위와 위치
를 알려주는 옵션이다.{
"include": ["src"]
}
{
"compilerOptions": {
"target": "ESNext"
},
"include": ["src"]
}
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext"
},
"include": ["src"]
}
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"outDir": "dist"
},
"include": ["src"]
}
{
"compilerOptions": {
...
"strict": true
},
"include": ["src"]
}
// a.ts
const a = 1; // ❌
// b.ts
const a = 1; // ❌
이럴 때에는 각 파일에 모듈 시스템 키워드(export, import)를 최소 하나 이상 사용해 해당 파일을 전역 모듈이 아닌 로컬(독립) 모듈로 취급되도록 만들어야 하는데 이를 자동화 하는 옵션이 바로 moduleDetection 옵션이다.
다음과 같이 moduleDection 옵션을 force로 설정할 경우 자동으로 모든 타입스크립트 파일이 로컬 모듈(독립 모듈)로 취급된다.
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"outDir": "dist",
"moduleDetection": "force"
},
"include": ["src"]
}
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"outDir": "dist",
"moduleDetection": "force"
},
"ts-node": {
"esm": true
},
"include": ["src"]
}