모든 객체 타입은 각각 다른 객체 타입들과 슈퍼-서브 타입의 관계를 갖는다.
따라서, 업 캐스팅은 허용하고 다운 캐스팅은 허용하지 않는다.
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
타입의 변수 animal
에 Dog
타입의 변수 dog
를 할당하는 것은 가능하지만 그 반대는 불가능하다.
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