
: 타입 계층도의 최상단에 위치, 모든 타입의 값 할당 가능
( 모든 타입은 unknown 타입으로 업캐스팅 가능 )

: 타입 계층도의 가장 아래에 위치, 공집합을 뜻하는 타입
( 모든 타입으로 업캐스팅 가능, 어떤 타입도 never 타입으로 다운캐스팅 불가능)

+never 타입은 아래 코드처럼 함수가 정상적으로 종료되지 않는 경우 (에러를 처리하는 경우)에 사용된다.
function errorFunc(): never {
throw new Error();
}
: 아무것도 반환하지 않는 함수의 반환값 타입으로 사용
✍️ undefined, never 타입의 값만 할당 가능
let voidVar: void;
voidVar = undefined; // undefined -> void (ok)
let neverVar: never;
voidVar = neverVar; // never -> void (ok)
: 치트키, 타입 계층도를 완전히 무시한다.
( 모든 타입의 슈퍼타입이 될 수도, 모든 타입의 서브타입이 될 수도 있다 )
모든 타입으로 다운 캐스팅 할 수 있고, 모든 타입은 any 타입으로 업캐스팅 될 수 있다.
최대한 사용하지 않도록 하자!!
let anyValue: any;
let num: number = anyValue; // any -> number (다운 캐스트)
let str: string = anyValue; // any -> string (다운 캐스트)
let bool: boolean = anyValue; // any -> boolean (다운 캐스트)
anyValue = num; // number -> any (업 캐스트)
anyValue = str; // string -> any (업 캐스트)
anyValue = bool; // boolean -> any (업 캐스트)
