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
타입에게도 예외는 없다.