객체 타입의 호환성 - 타입스크립트 이해하기

기본타입간의 호환성

let num1: number = 10;
let num2: 10 = 10;

num1 = num2;

객체 타입간의 호환성

→ 어떤 객체타입을 다른 객체타입으로 취급해도 괜찮은가?

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; // O 슈퍼 타입

// dog = animal; // X 서브 타입

// 슈퍼
// type Book = {
//     name: string;
//     price: number;
// };

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

let book : Book;
let programmingBook: ProgrammingBook = {
    name: "한 입 크기로 잘라먹는 리액트",
    price: 33000,
    skill: "reactjs"
}

book = programmingBook; // O
// programmingBook = book // X

// -----------------------------------------------------

// 위에는 가능한데 이건 왜 안되냐?

/**
 *  초과 프로퍼티 검사 -> 객체 리터럴로 정의하면 초과분은 안되도록 막는 검사
 */

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

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

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

// 초과 프로퍼티 검사 피하려면 이렇게 사용하면 허용 됨
let book3: Book = programmingBook; 
func(programmingBook);