집합의 개념으로 생각하자.
type A = string | number;
type B = string
type C = string & number; // 존재할 수 없음 => naver 속성
C < B < A
type A = { name: string };
type B = { age: number };
type C = { name: string, age: number }
// type C = A & B // 동일한 의미
type AB = A | B;
// 속성을 많이 가질 수록 구체적이고, 더 좁은 타입이 된다.
C < A
C < B
C < A, B < AB
const ab: AB = { name: 'minhyeong' }; // 넓은 타입
const cc: C = { name: 'minhyeong', age: 1 }; // 좁은 타입


❗️ 주의할 점
const ab: AB = { name: 'minhyeong' }; // 넓은 타입
const cc: C = { name: 'minhyeong', age: 1, **married: false** };
/*
'{name: string; age:number; married:boolean; }' 형식은 'C' 형식에 할당할 수 없습니다.
개체 리터럴은 알려진 속성만 지정할 수 있으며 'C' 형식에 'married'이(가) 없습니다.
*/
const ab: AB = { name: 'minhyeong' }; // 넓은 타입
const object = { name: 'minhyeong', age: 1, married: false };
const cc: C = object;
분명 더 많은 속성을 가지면 더 좁은 타입이고, type C = { name: string, age: number } 보다 { name: 'minhyeong', age: 1, married: false }; 은 더 좁은 타입이다. 그런데 넓은 타입에 좁은 타입을 대입했는데 오류가 발생한다.
개체 리터럴 속성을 바로 대입할 경우에는 잉여 속성 검사도 추가로 해서 그렇다고 한다…
이럴 때는 개체 리터럴을 바로 대입하지 않고, 중간에 다른 변수에 잠시 할당한 후 그 변수를 대입하면 된다.