[typeScript] 3. 기본 타입 및 객체 타입의 호환성

yricog·2025년 1월 25일
0

TypeScript

목록 보기
3/4
post-thumbnail

타입 계층도로 보는 기본타입 호환성

타입스크립트의 모든 타입은 집합이며 서로 부모-자식의 관계를 맺는다. 여기서 부모는 슈퍼 타입, 자식은 서브 타입이라 한다.

  • 서브 타입의 값을 슈퍼 타입으로 취급하는 것을 Up Cast(업 캐스트)라고 하며, 업 캐스트는 모든 상황에 허용된다.
  • 반대로 슈퍼 타입의 값을 서브 타입으로 취급하는 것은 Down Cast(다운 캐스트)라 하며, 대부분의 상황에서 허용되지 않는다.

위 타입 계층도를 보면서 기본 타입을 살펴보자.

1. Unknown 타입

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;
}

2. Never 타입

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;
}

3. Void 타입

void 타입은 undefined 타입의 슈퍼 타입이라는 것을 기억하자.

function voidExam() {
  function voidFun(): void {
    console.log("hi");
    return undefined; // return 가능 ⭕️
  }

  // undefined의 UpCasting ⭕️
  let voidVar: void = undefined;
}

4. Any 타입

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❌
}

profile
의미와 가치를 쫓는 개발자 ✨

0개의 댓글

관련 채용 정보