옵셔널이란 기존 타입에 undefined가 유니언된 것과 같습니다. 기존 타입 | undefined가 기존 타입보다 넓은 타입이므로 옵셔널인 객체가 더 넓은 타입입니다.
배열과 다르게 객체에서는 속성에 readonly가 붙어도 서로 대입할 수 있습니다.
type ReadOnly = {
readonly a: string;
readonly b: string;
};
type Mandatory = {
a: string;
b: string;
};
const o: ReadOnly = {
a: 'hi',
b: 'world',
};
const m: Mandatory = {
a: 'hello',
b: 'world',
};
const o2: ReadOnly = m;
const m2: Mandatory = o;
이렇게 넓은 타입, 좁은 타입만 구분할 수 있다면 누가 누구에게 대입할 수 있는지 없는지를 쉽게 판단할 수 있습니다.