객체는 이름이 아니라 모양으로 호환된다

값의 속성과 대상 계약을 나란히 놓고, 필요한 키와 각 값의 타입이 맞는지 검사한다.

검사할 객체 값

const user = {
  name: "영희",
  age: 22,
  id: "U-17"
};
모양 대조선언 이름은 달라도 됨

대상 계약

interface Person {
  name: string;
  age: number;
  isStudent?: boolean;
  readonly id: string;
}
1. 필수 키name · age · id가 모두 있는가?
2. 값 타입각 속성 값이 선언한 타입에 할당 가능한가?
3. 새 리터럴직접 전달한 객체라면 오타 같은 초과 키도 검사한다.

선택 속성 읽기
isStudent는 없을 수 있어 undefined 분기가 필요하다.

읽기 전용 쓰기
id는 계약을 통과한 뒤 그 타입을 통해 재할당할 수 없다.

결과 필수 모양이 맞으면 userPerson으로 사용할 수 있다.