자바스크립트로 작업하고 있던 어느 날.
갑자기 에러가 나기 시작해 원인을 찾아 몇시간이나 디버깅했지만
나중에 "변수 오타"가 문제였던 것을 알고 황망하기 그지없었다. 😩
자바스크립트는 동적 타이핑 언어이다.
즉 변수의 자료형을 자유롭게 바꿔가며 사용가능하다.
nums = [1234];
// A few months later...
nums = 5;
// nums가 갑자기 배열에서 숫자 5로 재할당됨??
위 특징은 자유롭다는 장점이 있으나 실수하기 쉽고 나중에 원인을 발견하기도 어렵다.
또한 자바스크립트는 인터프리터 언어이다.
따라서 코드를 실행하기 전에는 코드가 올바른지 검사할 방도가 없다.
온리 런타임오류로만 문제가 있는지 알아차릴 수 있다.
그래서 위 자바스크립트의 단점을 해결해줄 타입스크립트가 널리 쓰이기 시작하였다.
웹브라우저나 Node.js는 자바스크립트만 읽을 수 있기 때문에 TS코드는 그대로 실행할 수 없다. 따라서 JS로 변환한 파일을 실행해야한다.
타입스크립트 코드를 자바스크립트 코드로 트랜스파일해주는 도구를 타입스크립트 컴파일러(TSC)라고 한다.
컴파일러?: 컴파일하는 프로그램으로, 한프언어에서 다른프언어로 번역하는 것을 이야기한다. 보통 컴파일이라고 하면 소스코드를 컴퓨터가 실행할 수 있는 형태나 기계어로 변환하는 것을 뜻한다.
트랜스파일 Transpile: 또한 한 언어로 작성된 소스 코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는 것을 이라고 한다.
TSC
토막지식! Deno는 Node.js개발자들이 만든 런타임이다. Node.js와 비슷하지만 기본적으로 TS를 사용한다. 자체적으로 타입컴사와 트랜스파일링을 해주기 때문에 따로 TS를 위한 프로젝트 세팅을 할 필요가 없다고 함.
빌드해서 타입검사를 해보지 않아도 VS CODE의 intellisense가 미리 가르쳐준다!😸
let size = 100;
굳이 타입을 명시해주지 않은 모습.
let size: number = 100;
콜론을 써서 타입을 타입을 명시해준 모습.
let size: number;
작업을 마치고 js파일로 transpile해보면 아래처럼 변환된다.
let size: 100;
size = 105;
타입을 정의하는 부분은 사라진 것을 볼 수 있다.
타입 정의부분은 타입스크립트의 고유영역이며 타입은 타입검사하는데만쓰이고 실제 코드 실행에는 영향을 주지 않기 때문이다.
const product = {
id: 'c001',
name: '라이트 윈드 브레이커',
price: 129000,
};
// ...
product.price = '139000원'; // 문자열은 넣을 수 없음!!!
// ...
const salePrice = product.price * 0.9;
console.log(`할인 가격: ${salePrice}`);
만약 자바스크립트였다면 위 코드를 실행해서 문제를 일으킬때까지 숫자형 대신 문자형이 들어갔다고 눈치채지 못할 것이다.
그러나 타입스크립트에서는 실행하지 않고도 문제가 있음을 개발자에게 알려준다.
let product = {
id: 'c001',
name: '라이트 윈드 브레이커',
price: 129000,
sizes: ['M', 'L', 'XL'],
};
// ...
const newProduct = {
id: 'c002',
name: '다크 윈드 브레이커',
price: 139000,
sizes: [90, 95, 100, 105, 100],
// 문자열 배열이 아닌 숫자형 배열??
};
// ...
product = newProduct; // 형태가 일치하지 않아 에러!
문자열배열에 숫자형배열을 할당해주어 에러가 발생한다.
에러메세지가 조금 복잡한데...
Type '{ id: string; name: string; price: number; sizes: number[]; }' is not assignable to type '{ id: string; name: string; price: number; sizes: string[]; }'.
Types of property 'sizes' are incompatible.
Type 'number[]' is not assignable to type 'string[]'.
Type 'number' is not assignable to type 'string'.ts(2322)
눈이 @@ 이렇게 되지만 윗단부터 찬찬히 보면 가장 바깥의 전체 객체의 문제부터 한단계 한단계 안으로 범위를 좁혀들어가며 에러의 이유를 설명해주고 있다.
또한 CLI에서 build를 시도해도 똑같은 에러메세지를 띄우며 작업이 중단된다.