타입스크립트에서 타입이란 동일한 속성과 특징들을 갖는 집합이라고 볼 수 있다.
number 타입을 예로들면 정수, 소수, infinity, 숫자리터럴타입 등등은 모두 **서브타입(자식타입)**이라고 하고, 이들을 모두 아우르는 상위개념인 number 타입은 **슈퍼타입(부모타입)**이라 부른다.
이러한 집합론적 관계에서 서브타입의 모든 값들은 슈퍼타입에 포함되며, 따라서 서브타입의 값은 슈퍼타입이 요구되는 곳에 할당 될 수 있다. 이는 타입스크립트의 타입 호환성과 구조적 타이핑 시스템의 핵심 원리가 된다.

서브타입의 값을 슈퍼타입으로 취급하는건 가능하나, (업캐스팅) 반대의 경우는 불가하다.(다운캐스팅)

let num1: number = 10; // 넘버타입
let num2: 10 = 10; // 리터럴타입 10
num1 = num2;
num2 = num1; // 에러

타입계층도

타입 호환표
unknown 타입은 모든값을 업캐스팅 할 수 있다 (슈퍼타입이기 때문에)
function unknownExam(){
let a: unknown = 1;
let b: unknown = 'hi';
let c: unknown = true;
let d: unknown = null;
let e: unknown = undefined;
let unknownVar: unknown;
// 다운캐스팅은 불가하다
let num: number = unknownVar;
let str: string = unknownVar;
let bool: boolean = unknownVar;
}
never타입은 모든타입의 부분집합이다 (공집합)
해당함수를 never로 지정해주는것은 함수가 반환할 수 있는 것이 없다는걸 의미한다. 이 함수의 반환값의 종류는 공집합이다라는 의미
function neverExam(){
funcion neverFunc():never {
while(true){}
}
}
never 타입은 모든 타입의 서브타입(부분집합)이기 때문에 어떤 타입의 변수에도 값을 넣을 수 있다. (업캐스팅)
function neverExam() {
let num: number = neverFunc();
let str: string = neverFunc();
let bool: boolean = neverFunc();
// 다운캐스팅은 당연히 안된다.
let never1: never = 1
}