📑 목차
지난 포스팅에서 "타입은 집합이다" 라는 사실을 배웠다. 이번에는 이 개념을 확장해서 타입스크립트의 전체 족보, 즉 타입 계층도를 뜯어보자.
계층도의 위치에 따라 타입 간의 호환성(업캐스팅, 다운캐스팅)이 결정된다.
1. 타입 계층도 (Type Hierarchy)
먼저 전체적인 그림을 보자. 가장 위에는 unknown이 있고, 가장 아래에는 never가 있다. 그리고 그 사이를 any가 가로지르고 있다.

2. unknown 타입 (전체 집합)
unknown 타입은 타입 계층도의 최상단에 위치한다.
집합으로 따지면 모든 타입을 포함하는 전체 집합(Universal Set) 이다.
특징
- 모든 타입을 받을 수 있다 (업캐스팅):
unknown은 모든 타입의 부모(슈퍼 타입)이므로, 어떤 값이든 할당할 수 있다. - 아무데도 들어갈 수 없다 (다운캐스팅 불가): 부모가 자식 집합에 들어갈 수 없듯이,
unknown타입의 값은any를 제외한 그 어떤 타입의 변수에도 할당할 수 없다.
let a: unknown = 1; // ✅ 가능 (number -> unknown)
let b: unknown = "hello"; // ✅ 가능 (string -> unknown)
let unknownVal: unknown;
// let num: number = unknownVal; // ❌ 불가능 (unknown -> number)
3. never 타입 (공집합)
never 타입은 타입 계층도의 가장 아래에 위치한다.
집합으로 따지면 아무것도 포함하지 않는 공집합(Empty Set) 이다.
특징
- 값이 없다: 공집합이므로
never타입에 해당하는 값은 존재하지 않는다. - 모든 타입에 들어갈 수 있다 (업캐스팅): 공집합은 모든 집합의 부분 집합이다. 따라서
never는 모든 타입의 자식(서브 타입)이며, 모든 타입으로 할당 가능하다. - 아무것도 받을 수 없다 (다운캐스팅 불가): 그 어떤 타입도
never타입으로 다운캐스팅할 수 없다.
사용 예시
주로 정상적으로 종료되지 않는(반환값이 없는) 함수에 사용된다.
function errorFunc(): never {
throw new Error();
}
let num: number = errorFunc(); // ✅ 가능 (never -> number)
// let n: never = 10; // ❌ 불가능 (number -> never)
4. void 타입
void는 아무것도 반환하지 않는 함수의 반환값으로 주로 쓰인다.
계층도상에서 void는 **undefined 타입의 슈퍼 타입(부모)**에 해당한다.
특징
undefined를 품는다:undefined는void의 서브 타입이므로,void타입 변수에undefined를 할당할 수 있다.- 엄격한 할당:
void에는undefined와never를 제외하고는 다른 값을 할당할 수 없다.
function noReturn(): void {
return undefined; // ✅ 가능
}
let voidVar: void;
voidVar = undefined; // ✅ 가능
5. any 타입 (치트키)
any 타입은 사실상 타입 계층도를 무시하는 치트키다.
모든 타입의 슈퍼 타입이 될 수도 있고, 서브 타입이 될 수도 있는 예외적인 존재다.
특징
- 모든 타입 -> any (업캐스팅): 어떤 값이든
any변수에 넣을 수 있다. - any -> 모든 타입 (다운캐스팅):
any변수는 어떤 타입의 변수에도 넣을 수 있다.
let anyValue: any;
// 모든 값을 다 받음 (업캐스팅)
anyValue = 10;
anyValue = "hello";
// 모든 곳에 다 들어감 (다운캐스팅)
let num: number = anyValue;
let str: string = anyValue;
any는 타입 시스템의 규칙을 파괴하므로, 사용에 각별한 주의가 필요하다.
요약
unknown: 전체 집합 (최상위). 모든 값을 받지만, 어디에도 못 간다.never: 공집합 (최하위). 값을 못 받지만, 어디든 갈 수 있다.void:undefined의 부모.any: 계층 파괴자. 규칙을 무시하고 어디든 오고 간다.
