객체 타입의 호환성

객체 타입에서도 기본 타입간에 적용되던 업 케스팅/다운 케스팅 원리가 적용된다.

객체 타입에서도 모든 업 케스팅은 허용되며, 다운케스팅은 허용되지 않는다.

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; // ✅ OK
dog = animal; // ❌ NO

여기서 Animal의 자식은 Dog 이다.

(더 많은 프로퍼티를 가지는 객체가 자식이다.)

객체에서도 업 케스팅이 되므로 dog는 animal에 넣을 수 있지만, animal에 dog를 넣을 수는 없다.

(구조적 타이핑 원리)

초과 프로퍼티 검사

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

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

(...)

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

변수를 객체 리터럴로 초기화 할 때 초과 프로퍼티 검사 가 실행된다.

위에서는 객체 타입보다 더 많은 프로퍼티를 초기화 하려고 하였지만 에러가 발생하였다.

값을 별도의 다른 변수에 보관한 다음 변수 값을 초기화 값으로 사용하면 발생하지 않는다.

let book3: Book = programmingBook; // 앞서 만들어둔 변수

이는 동일한 원리로 인자로 전달할 때에도 발생한다.

function func(book: Book) {}

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

func(programmingBook); // 성공