타입스크립트의 '타입'은 사실 여러개의 값을 포함하는 '집합'이다.
집합은 동일한 속성을 갖는 여러개의 요소들을 하나의 그룹으로 묶은 단위를 말한다.
그렇다면, 오직 하나의 값만 포함하는 타입인 Number Literal타입은 어떤 집합일까?
let num: 20 = 20;
이 타입은 아래의 그림과 같이 딱 하나의 값만 포함하는 아주 작은 집합이라고 볼 수 있다.
그리고, 이러한 Number Literlal 타입은 Number 타입이라는 거대한 집합에 포함되는 부분집합이기도 하다.
타입스크립트의 모든 타입들은 집합으로써 서로 포함하고 또 포함되는 관계를 가진다.
Number 타입처럼 다른 타입을 포함하는 타입은 슈퍼타입(부모타입
이라고 부르며, 그 반대는 서브타입(자식타입)
이라고 한다.
타입호환성이란, A와 B 두 개의 타입이 존재한다고 할 때 A타입의 값을 B타입으로도 취급해도 괜찮은지 판단하는 것을 의미한다.
A타입의 값이 B타입의 값으로 취급되어도 괜찮다면 호환된다고 하며, 그 반대라면 호환되지 않는다고 한다.
위 그림을 보면, 서브타입인 Number Literal 타입의 값을 슈퍼타입인 Number 타입의 값으로 취급하는 것은 가능하지만 그 반대는 불가능하다.
Number 타입이 더 큰 타입이기 때문이다.
다음의 코드를 보면,
let num1: number = 10;
let num2: 10 = 10;
num1 = num2;
num1
의 타입이 num2
의 타입보다 큰 타입이기 때문에 num1
에 num2
의 값을 저장하는 것이 가능하다.
하지만, 다음과 같이 반대의 경우는 불가능하다.
이 때, 서브타입의 값을 슈퍼타입의 값으로 취급하는 것을 업 캐스팅이라고 하며, 그 반대의 경우는 다운 캐스팅이라고 한다.
정리하자면, 타입스크립트에서 업캐스팅은 모든 상황에 가능하지만 다운 캐스팅은 대부분의 상황에서 불가능하다고 할 수 있다.