반응형

TypeScript. 타입의 모든 것

우리가 흔히 아는 타입은 int(정수형) 타입, boolean(불) 타입 등이 있다.

타입스크립트를 쓰며 볼 수 있는 타입의 모든 것을 확인하기 전에 이러한 타입의 정확한 정의를 알아보자.

 

타입(type): 값과 이 값으로 할 수 있는 일의 집합

 

즉, boolean 타입은 모든 bool(true or false)과 bool에 수행할 수 있는 모든 연산(||, &&, ! 등)의 집합이다.

또한 number 타입은 모든 숫자와 숫자에 적용할 수 있는 모든 연산(+, -, *, /, %, ||, &&, ? 등), 숫자에 호출할 수 있는 모든 메서드(.toFixed, .toPrecision, .toString 등)의 집합이다.

기존에 단순히 값의 타입이라고만 알고 있었던 독자들은 값뿐만 아니라 그 값에 적용할 수 있는 모든 연산과 메서드와 같은 할 수 있는 일의 집합이라는 사실도 하나 알아가길 바란다.

 

다음으로는 타입스크립트에서 이용할 수 있는 전체 타입의 개요를 볼 수 있는 타입스크립트의 타입 계층 이미지이다.

타입스크립트의 타입 계층

위의 그림을 보면서 각각의 타입이 무엇인지, 무엇을 포함할 수 있는지, 어떤 일을 할 수 있는지 살펴보자.

 

unknown

먼저, 최상위 계층에 있는 unknown이다. unkown은 타입을 미리 알 수 없는 어떤 값이 있을 때 사용한다. unknown은 어떤 연산을 지원할까? unknown은 기본적으로 비교 연산(==, ===, ||, &&, ?)과 반전(!)을 지원하고 typeof, instanceof 연산자를 사용할 수 있다.

이러한 unknown은 바로 아래의 any와 매우 유사하지만 any는 어떤 타입의 값인지 모를 때 모든 값을 사용할 수 있지만 unknown은 타입스크립트가 사용할 수 없게 강제하기 때문에 진짜 무슨 타입의 값을 쓸 지 모를 때 any 보다는 unknown을 쓰는 것이 좋다. 참고로 타입스크립트가 자동으로 unknown이라고 추론하는 상황은 없으며 unknown은 오직 개발자가 명시적으로 설정한 경우에만 표현된다.

 

any

any는 모든 타입들의 부모라고 할 수 있다. any는 말 그대로 무엇이든 할 수 있지만 꼭 필요한 상황이 아니라면 안쓰는 것이 좋다. 타입스크립트는 컴파일 시점에 모두가 타입이 있어야 하기 때문에 타입을 알 수 없을 때 any라고 가정한다. 그러나 타입스크립트의 철학에 맞게 any는 가급적 사용하면 안좋다. 그 이유는 any를 사용하면 자바스크립트와 동일하게 수행되면서 더이상 타입 검사기라는 생산성을 높여주는 유용한 도구가 쓸모가 없어지기 때문이다.

 

boolean

boolean 타입은 true(참)과 false(거짓)이라는 두 개의 값을 갖는다. 이 타입으로는 비교 연산과 반전 연산뿐만 할 수 있고 그외의 연산은 지원하지 않는다.

 

number

number 타입은 모든 숫자(정수, 소수, 양수, 음수, Infinity, NaN 등)의 집합으로 비교 연산과 숫자 관련 연산을 수행할 수 있다.

 

bigint

앞의 타입들과 다르게 bigint는 익숙하지 않을 것이다. 그 이유는 bigint 타입은 자바스크립트와 타입스크립트에 새로 추가된 타입이기 때문이다. 이 타입을 이용하면 에러 걱정 없이 큰 정수를 처리할 수 있다. number는 253까지의 정수를 표현할 수 있지만 bigint 타입은 훨씬 큰 수도 표현할 수 있다. 이 타입도 number 변수처럼 비교 연산과  숫자 관련 연산을 수행할 수 있다. 가능하면 타입스크립트가 number가 아니라 bigint를 추론하게 만드는 것이 좋다.

 

string

string은 모든 문자열의 집합으로 연결(+, 사칙연산의 덧셈과 다름(다형성)), 슬라이스(.slice) 등의 문자열 관련 연산을 수행할 수 있다.

 

symbol

심벌은 ES2015에 새로 추가된 기능이다. 이 기능은 자주 사용하지 않는 편이고 객체와 맵에서 문자열 키를 대신하는 용도로 사용한다. 심벌을 사용하면 사용자들이 잘 알려진 키만 사용하도록 강제할 수 있어 키를 잘못 설정하는 실수를 방지할 수 있다는 장점이 있다.

 

object, Object

객체 타입은 객체의 형태(shape)를 정의한다. 하지만 타입스크립트에서는 객체 타입만으로 {}로 만든 간단한 객체와 new를 사용해 만든 복잡한 객체를 구분할 수 없다.