Typescript documentation의 Handbook-The Basics ,
2.0 release note,
위키의 Type System
글을 참고하였다.
타입스크립트는 자바스크립트에 타입 시스템 을 지원한다.
타입 시스템이 뭔데?
타입 시스템은 변수나, expression, function 등 프로그램을 구성하는 구조들에 type이라는 속성을 할당하는 규칙들을 갖는 시스템이다. 타입 시스템은 타입과 값들을 비교하고 이러한 값들이 어떻게 이용되는 지를 분석하여 버그의 확률을 줄이는 것을 목표로 한다.
자바스크립트는 dynamic typing 을 지원한다.
type checking이 대부분 run-time에 진행되며, 타입은 변수가 아닌 값 value과 매핑된다. type error는 runtime에 발생하기 때문에 에러를 확인하기 위해서는 코드를 작동시켜봐야 한다.
그래서 타입스크립트는 static type-checking을 추가로 지원한다.
type checking이 compile-time에 진행된다. type이 값이 아니라 변수와 매핑되며, 대부분의 type error들을 미리 캐치할 수 있도록한다.
→ 실제 코드를 작동시키기 전에 미리 버그들을 찾아서 고칠 수 있다!
자바스크립트가 모든 unexpected behavior에 runtime error를 던지지는 않는다. 예를 들어 존재하지 않는 property에 접근할 때, 자바스크립트는 runtime error 대신, undefined를 리턴한다.
이렇게 자바스크립트가 runtime error를 던지지 않는 상황에서도 타입스크립트는 Error를 발생시켜 우리가 원하지 않는 결과가 나오는 상황을 미리 방지해준다.
const user = {
name: "Daniel",
age: 26,
};
user.location;
위와 같은 코드는 타입스크립트에서
Property 'location' does not exist on type '{ name: string; age: number; }'. 라는 에러를 발생시킨다.
추가적으로 uncalled function이나 basic logic error들에 대해서도 타입스크립트는 에러를 발생시킨다.
function flipCoin() {
// Meant to be Math.random()
return Math.random < 0.5; // ERROR
}
-- ERROR : Operator '<' cannot be applied to types '() => number' and 'number'.
const value = Math.random() < 0.5 ? "a" : "b";
if (value !== "a") {
// ...
} else if (value === "b") {
// Oops, unreachable
// ERROR
}
-- ERROR : This condition will always return 'false' since the types '"a"' and '"b"' have no overlap.
타입스크립트의 컴파일러인 tsc는 타입스크립트 파일을 자바스크립트 파일로 바꿔준 후 실행시킨다.
그럼 타입스크립트가 자바스크립트로 변환할 때 어떤 일이 생길까?
tsc --target es2015 file.ts타입스크립트에서는 기본적으로 타입 지정이 필수가 아니며, 모든 타입에 null이나 undefined를 할당하는 것이 가능하다.
추가적으로 STRICTNESS FLAGS 를 추가하여 좀 더 강력한 TYPE-CHECKING을 이용할 수 있다.
noImplicitAny : will issue an error on any variables whose type is implicitly inffered as 'any'
strictNullChecks : 원래 모든 타입에 null/undefined를 할당 가능한 것이 금지된다. null 또는 Any 타입인 경우에만 null을 할당 가능하다. (undefined도 마찬가지) mores