타입스크립트의 모든 타입은 집합이며 서로 부모-자식의 관계를 맺는다. 여기서 부모는 슈퍼 타입, 자식은 서브 타입이라 한다.
위 타입 계층도를 보면서 기본 타입을 살펴보자.
unknown 타입은 전체 집합 즉, 최상위 슈퍼 타입이다.
때문에 모든 타입의 업 캐스트는 가능하지만, unkown 타입의 다운 캐스트는 불가능하다.
function unknownExam() {
// 모든 타입의 UpCasting ⭕️
let a: unknown = 1;
let b: unknown = "hello";
let c: unknown = true;
let d: unknown = null;
let e: unknown = undefined;
// unknown의 DownCasting ❌
let unknownVar: unknown;
let num: number = unknownVar;
let str: string = unknownVar;
let bool: boolean = unknownVar;
}
never 타입은 공집합(=아무것도 없음) 즉, 최하위 서브 타입이다.
때문에 never 타입의 업 캐스트는 모두 가능하고, 다른 타입의 다운 캐스트는 모두 불가능하다.
function neverExam() {
function neverFun(): never {
while (true) {}
}
// never의 UpCasting ⭕️
let num: number = neverFun();
let str: string = neverFun();
let bool: boolean = neverFun();
// 모든 타입의 DownCasting ❌
let never1: never = 10;
let never2: never = "string";
let never3: never = true;
}
void 타입은 undefined 타입의 슈퍼 타입이라는 것을 기억하자.
function voidExam() {
function voidFun(): void {
console.log("hi");
return undefined; // return 가능 ⭕️
}
// undefined의 UpCasting ⭕️
let voidVar: void = undefined;
}
any 타입은 타입 계층도를 완벽히 무시하는 치트키 타입이다.
모든 타입의 최상위 슈퍼 타입 또는 최하위 서브 타입으로 위치하기도 한다.(never는 제외)
때문에 사용이 권장되지 않음!! 🙅🏻♀️
function anyExam() {
let unknownVar: unknown;
let anyVar: any;
let undefinedVar: undefined;
let neverVar: never;
// unknown을 any로 DownCationg ⭕️
anyVar = unknownVar;
// any를 undefined로 DownCationg ⭕️
undefinedVar = anyVar;
// never만 DownCationg ❌
neverVar = anyVar;
}
⭐️ 타입 호환표
객체 타입 간에는 추가 프로퍼티가 있는 객체가 서브 타입(자식)이 되고, 공통 프로퍼티만 가지고 있는 객체가 슈퍼 타입(부모)가 된다. 객체 타입 역시 Up Cast는 가능하고 Down Cast는 대체로 불가능하다.
// 슈퍼 타입
type Animal = {
name: string;
color: string;
};
// 서브 타입
type Dog = {
name: string;
color: string;
breed: string;
};
let animal: Animal = {
name: "기린",
color: "yellow",
};
let dog: Dog = {
name: "돌돌이",
color: "brown",
breed: "진돗개",
};
animal = dog; // Up Cast ⭕️
console.log(animal); // { name: '돌돌이', color: 'brown', breed: '진돗개' }
dog = animal; // Down Cast ❌
또한 아래와 같이 슈퍼 타입의 변수에 서브 타입을 선언한 변수를 넣어 초기화도 가능하다.
let animalExm: Animal = dog;
But, 객체 리터럴로 초기화 시 ts의 초과 프로퍼티 검사로 인한 오류가 나니 조심!!
let animalExm: Animal = { name: "돌돌이", color: "brown", breed: "진돗개", ❌ERROR❌ }