객체 타입의 호환성

woodstock·2023년 12월 10일
0
post-thumbnail

객체 타입의 호환성

모든 객체 타입은 각각 다른 객체 타입들과 슈퍼-서브 타입의 관계를 갖는다.
따라서, 업 캐스팅은 허용하고 다운 캐스팅은 허용하지 않는다.

예제

예제 1.

type Animal = {
  name: string;
  color: string;
};

type Dog = {
  name: string;
  color: string;
  breed: string;
};

let animal: Animal = {
  name: "기린",
  color: "yeelow",
};

let dog: Dog = {
  name: "와와",
  color: "brown",
  breed: "치와와",
};

Animal타입이 Dog타입의 슈퍼타입이기 때문에 Animal타입의 변수 animalDog타입의 변수 dog를 할당하는 것은 가능하지만 그 반대는 불가능하다.

예제 2.

type Book = {
  name: string;
  price: number;
};

type ProgrammingBook = {
  name: string;
  price: number;
  skill: string;
};

let book: Book;
let programmingBook: ProgrammingBook = {
  name: "한 입 크기로 잘라먹는 타입스크립트",
  price: 33000,
  skill: "TypeScript",
};


초과 프로퍼티 검사

초과 프로퍼티 검사란 변수를 객체 리터럴로 초기화 할 때 발동하는 타입스크립트의 특수한 기능이다.
이 기능은 타입에 정의된 프로퍼티 외의 다른 초과된 프로퍼티를 가지는 객체는 변수에 할당할 수 없도록 막는다.

type Book = {
  name: string;
  price: number;
};
let book2: Book = { // 오류 발생
  name: "한 입 크기로 잘라먹는 리액트",
  price: 33000,
  skill: "ReactJS",
};

function func(book: Book) {}
func({ // 오류 발생
  name: "한 입 크기로 잘라먹는 리액트",
  price: 33000,
  skill: "ReactJS",
});

따라서, 위 코드는 Book타입에 정의되지 않은 skill프로퍼티를 갖는 객체를 할당하려고 했으므로 초과 프로퍼티 검사에 의해 오류가 발생한다.

이러한 초과 프로퍼티 검사는 단순히 변수를 초기화 할 때 객체 리터럴을 사용하지만 않으면 발생하지 않기 때문에 다음과 같이 값을 별도의 다른 변수에 보관한 다음 변수 값을 초기화 값으로 사용하면 발생하지 않는다.

let programmingBook: ProgrammingBook = {
  name: "한 입 크기로 잘라먹는 타입스크립트",
  price: 33000,
  skill: "TypeScript",
};
let book3: Book = programmingBook; // ✅ OK
func(programmingBook); // ✅ OK
profile
해내는 사람

0개의 댓글