

unknown타입은 타입 계층도의 최상단에 위치한다.

따라서 unknown타입 변수에는 모든 타입의 값을 할당할 수 있다.
즉, 모든 타입은 unknown타입으로 업 캐스트 할 수 있는 것이다.
function unknownExam() {
let a: unknown = 1;
let b: unknown = "hello";
let c: unknown = true;
let d: unknown = null;
let e: unknown = undefined;
}
반면에 다른 타입이 unknown타입으로 다운 캐스트하는 것은 불가능하다.

never타입은 타입 계층도에서 가장 아래에 위치하며, 공집합을 뜻하는 타입이다.


공집합은 모든 집합의 부분집합이다.
그러므로 never타입은 모든 타입의 서브 타입이라고 할 수 있다.
따라서 never타입은 모든 타입으로 업캐스팅 할 수 있다.
function neverExam() {
function neverFunc(): never {
while (true) {}
}
let num: number = neverFunc();
let str: string = neverFunc();
let bool: boolean = neverFunc();
}
반면 그 어떤 타입도 never타입으로 다운 캐스팅 할 수는 없다.


void타입은 undefined타입의 슈퍼타입이다.

따라서, 반환값을 void로 선언한 함수에서 undefined를 반환해도 오류가 발생하지 않는다.
function voidExam() {
function voidFunc(): void {
console.log("hi");
return undefined;
}
let voidVar: void = undefined;
}
any타입은 사실상 타입 계층도를 완전히 무시한다.

모든 타입의 슈퍼타입이 될 수도 있고, 모든 타입의 서브타입이 될 수도 있다.
function anyExam() {
let unknownVar: unknown;
let anyVar: any;
let undefinedVar: undefined;
// unknown타입이 any타입으로 다운캐스트 가능
anyVar = unknownVar;
// any타입이 undefined로 다운캐스트 가능
undefinedVar = anyVar;
}
그러나 any타입이 never타입으로 다운캐스트하는 것은 불가능하다.

never타입은 정말 순수한 공집합이기 때문에 그 어떤 타입도 다운캐스팅 할 수 없기 때문이다.
never타입에서만큼은 any타입에게도 예외는 없다.
