슈퍼타입과 서브타입
타입스크립트의 타입은 집합 관계처럼 되어있다. 예를 들면 number 타입과 number literal 타입같은 경우 number 타입이 더 큰 범위이면서 number literal 타입을 포함하고 있다.
이런 경우에 number 타입을 number literal 타입의 슈퍼타입 또는 부모타입이라고 부르고, number literal 타입을 number 타입의 서브타입 또는 자식타입이라고 부른다.
타입 호환성
이렇게 각 타입의 관계가 있을 때 관계에 따라 타입이 호환되거나 호환되지 않을 수가 있다. 이를 타입 호환성이라 한다.
아까 number 타입을 예로 들면 number 타입은 서브타입인 number literal 타입에 호환되지 않는다. 반대로 number literal 타입은 슈퍼타입인 number 타입에 호환된다.
아래 사진을 보자
위 코드를 보면 num1과 num2 모두 10이라는 값을 할당하였지만 number literal 타입의 변수를 number 타입 변수에 할당하는 것은 가능하지만, 그 반대에 경우에는 에러를 발생하고 있다.
이처럼, 서브타입을 슈퍼타입에 할당하는 것을 업 캐스팅이라 부르고, 반대로 슈퍼타입을 서브타입에 할당하는 것을 다운 캐스팅이라 부른다.
타입 호환성 더 살펴보기
앞서 말했듯 타입은 집합 형태로 특정 타입이 다른 타입을 포함하거나 포함되어 있다. 몇몇 타입들을 좀 더 살펴보자.
모든 타입의 슈퍼타입 unknown
첫 번째로 살펴볼 타입은 unknown 타입이다. 이 타입은 타입 계층에서 최상단에 위치한 모든 타입의 슈퍼타입이다.
따라서, 모든 타입에서 unknown 타입으로 업 캐스팅이 가능하다.
모든 타입의 서브타입 never
두 번째로 살펴볼 타입은 never 타입이다. unknown 타입과는 반대로 타입 최하층에 위치하며 모든 타입에 서브타입이 된다. 따라서, never 타입은 모든 타입에 업 캐스팅이 가능하다.
undefined 타입의 슈퍼타입 void
void 타입은 앞선 두 개의 타입과 비교하면 타입 계층 가운데에 위치한 평범한 타입이다.
하지만 undefined 타입을 포함하는 undefined의 슈퍼타입이라는 특수성이 있다.
가장 조심해야할 any 타입
마지막으로 any 타입에 대해 살펴보겠다. 타입스크립트를 사용하다보면 타입스크립트를 마치 자바스크립트처럼 만들어주는 any 타입을 본 적이 있을 것이다. 또한, any 타입을 최대한 지양하자라는 의견도 들어봤을 것 이다.
이는 any 타입이 가진 특수성 때문인데 any 타입은 타입 계층에 영향을 받지 않는다.
신기하게도 모든 타입으로 업 캐스팅이 가능하며 모든 타입으로 다운 캐스팅도 가능하다.
이러한 특수성 때문에 any 타입을 최대한 지양해야 한다.
참고자료
한 입 크기로 잘라먹는 타입스크립트(TypeScript)
한 입 크기로 잘라먹는 타입스크립트(TypeScript) 강의 | 이정환 Winterlood - 인프런
이정환 Winterlood | 문법을 넘어 동작 원리와 개념 이해까지 배워도 배워도 헷갈리는 타입스크립트 이제 제대로 배워보세요! 여러분을 타입스크립트 마법사🧙🏻♀️로 만들어드립니다., 프론
www.inflearn.com
'언어 > TypeScript' 카테고리의 다른 글
대수 타입 (0) | 2024.08.13 |
---|---|
객체 타입의 호환성 (0) | 2024.08.13 |
타입스크립트의 타입 (2) (0) | 2024.08.09 |
타입스크립트의 타입 (1) (0) | 2024.08.08 |
프로그래밍 언어의 타입 시스템 (0) | 2024.08.06 |