타입은 집합이다

타입스크립트에서 타입이란 동일한 속성과 특징들을 갖는 집합이라고 볼 수 있다.

number 타입을 예로들면 정수, 소수, infinity, 숫자리터럴타입 등등은 모두 **서브타입(자식타입)**이라고 하고, 이들을 모두 아우르는 상위개념인 number 타입은 **슈퍼타입(부모타입)**이라 부른다.

이러한 집합론적 관계에서 서브타입의 모든 값들은 슈퍼타입에 포함되며, 따라서 서브타입의 값은 슈퍼타입이 요구되는 곳에 할당 될 수 있다. 이는 타입스크립트의 타입 호환성과 구조적 타이핑 시스템의 핵심 원리가 된다.

image.png

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

image.png

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

num1 = num2;
num2 = num1; // 에러

타입계층도

타입계층도

타입계층도

타입 호환표

타입 호환표

unknown 타입(전체집합)

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타입은 모든타입의 부분집합이다 (공집합)

해당함수를 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
}