객체 타입에서도 기본 타입간에 적용되던 업 케스팅/다운 케스팅 원리가 적용된다.
객체 타입에서도 모든 업 케스팅은 허용되며, 다운케스팅은 허용되지 않는다.
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); // 성공