객체에도 슈퍼타입이 있다.
아래 예제를 보면,
- Animal에 Dog 타입을 대입하는 것은 되지만
- Dog에 Animal 타입을 대입하는 것은 불가능하다.
이유는 Animal 타입이 슈퍼타입이기 때문이다. 모든 객체 타입은 각각 다른 객체 타입들과 슈퍼-서브 타입 관계를 갖는다. 객체 타입도 마찬가지로 업캐스팅은 되고, 다운캐스팅은 안되기 때문에 서브타입인 Dog에 슈퍼타입인 Animal을 대입할 수 없다.
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
초과 프로퍼티 검사
아래와 같은 코드가 있을 때, Book은 슈퍼타입이므로, book2 변수 선언 시 서브타입에 해당하는 값으로 초기화하려고 하면 오류가 발생한다.
이유는 ‘초과 프로퍼티 검사’가 발생했기 때문이다. 초과 프로퍼티 검사란 변수를 객체 리터럴로 초기화 할 때 발동하는 타입스크립트의 특수한 기능이다.
이 기능은 타입에 정의된 프로퍼티 외의 다른 초과된 프로퍼티를 갖는 객체를 변수에 할당할 수 없도록 막는다.
type Book = {
name: string;
price: number;
};
type ProgrammingBook = {
name: string;
price: number;
skill: string;
};
(...)
let book2: Book = { // 오류 발생
name: "한 입 크기로 잘라먹는 리액트",
price: 33000,
skill: "reactjs",
};
대입을 가능하게 하려면 서브타입에 값을 대입한 후에, 해당 서브타입 객체를 슈퍼타입에 대입하는 방법을 이용해야 한다.
'Language > TypeScript' 카테고리의 다른 글
| [TypeScript] instanceof와 in 타입 가드 (0) | 2025.04.28 |
|---|---|
| [TypeScript] 타입 단언 (0) | 2025.04.22 |
| [TypeScript] 객체 타입의 값을 변경할 때 주의사항 : 불변성 (0) | 2025.04.16 |
| [TypeScript] 타입 호환성 : 업캐스팅과 다운캐스팅 (0) | 2025.04.11 |
| [TypeScript] Any, Unknown 타입 (0) | 2025.04.04 |