타입스크립트의 존재 이유는 무엇일까? 한 마디로 말하자면, 타입 안정성 때문이다. 덕분에 버그가 눈에 띄게 줄어들고, 런타임 에러를 방지할 수 있으며 생산성도 늘어난다. 자바스크립트는 매우 유연한 언어지만 만약 개발자가 정신 못 차리고 이상한 코드를 작성해도 개발자를 이해하고 도와주려 한다.

예를 들어, [1, 2, 3, 4] + false ⇒ 1, 2, 3, 4false…?? 이게 뭐지? 배열도 해체되고 false가 꽁무니에 합쳐졌네? 엄청 이상한 일인데 이런 이상한 일이 자바스크립트는 허용한다는 말이다. 최악은 런타임 에러도 일어날 수 있다.

타입스크립트는 함수를 만들 때, 이 함수에는 입력값이 두 개라고 알려주고 입력값을 하나만 보내는 것을 허용하지 않는다. 코드가 실행되기 이전에 타입스크립트는 이 함수에 입력값이 두 개가 필요하다는 걸 알기 때문에 개발자에게 멍청한 짓 좀 그만하라고 알려준다. const nico = {nico: name} 에서 nico.hello( )를 실행한다고 치면 자바스크립트는 일단 실행해서 런타임 오류가 나지만, 타입스크립트에서는 만약 이 코드를 돌리면 런타임 에러가 일어날 거라고 “경고” 할 것이다.

타입스크립트는 Strongly Typed(강 타입) 프로그래밍 언어다. NodeJS는 타입스크립트와 자바스크립트 양쪽 모두를 이해할 수 있는 반면, 브라우저는 타입스크립트를 이해하기 못하기 때문에 자바스크립트로 변환된다. 타입스크립트는 간단히 말해 개발자가 멍청한 짓을 하지 않게 보호해주는 역할을 하는데, 어떻게 보호하는지에 알아볼 필요가 있다.

타입스크립트가 제공하는 보호장치는 타입스크립트 코드가 자바스크립트 코드로 변환되기 전에 발생한다. 즉, 타입스크립트가 먼저 내 코드를 확인한 다음에 변환된 자바스크립트 안에서 실수가 일어나지 않게 확인해준다. 다르게 말하자면, 타입스크립트 코드에 에러가 있으면, 그 코드는 자바스크립트로 컴파일 되지 않는다.

타입스크립트의 타입 시스템, 타입스크립트는 데이터와 변수의 타입을 명시적으로 정의할 수도 있고, 그냥 자바스크립트처럼 변수만 생성하고 넘어가도 된다. 여기서 좋은 점은 타입스크립트가 타입을 추론해준다는 점이다.

let a = "hello"
a = "bye"
a = 1

//  이 코드는 자바스크립트라면 실행하겠지만, 
//  타입스크립트는 그렇지 않다... 타입을 TS가 알아서 추론해준다.

let a: boolean = "x"  //  이 코드도 에러가 난다. boolean 타입인데 string 타입을 줬기 때문

const player = {
	name: string
	age?: number  //  Optional Parameter 설정, age는 number 혹은 undefined
} = {
	name: "nico"
}

중복을 피하기 위해 Alias(별칭) 타입을 사용할 수도 있는데, 위 코드로 다시 작성해보자.

type Player = {
	name: string
	age?: number
}

const nico: Player = {
	name: "nico"
}

//  함수에서의 사용
type Player = {
	name: string
	age?: number
}

function playerMaker1(name: string): Player {
	return {
		name
	}
}

const playerMaker2 = (name: string): Player => ({name})

const nico = playerMaker1("nico")
nico.age = 12