2.10 객체의 속성과 메서드에 적용되는 특징을 알자


객체의 속성에도 옵셔널이나 readonly 수식어가 사용 가능하다.

interface Example {
	hello: string;
	world?: number;
	readonly wow: boolean;
	readonly multiple?: symbol;
}
const example: Example = {
	hello: 'hi',
	wow: false,
};
example.no; // 이런건 존재 x
example.wow = true; // wow는 readonly이기 때문에 새로 할당 불가능
const example: Example = {
	hello: 'hi',
	world: undefined, // world는 옵셔널이 붙어있기 때문에 가능함
	wow: false,
};
interface Example {
	hello: string;
}
const example: Example {
	hello: 'hi',
	why: '나만 에러', // 에러 (interface Example에 why 속성 없음)
}
const obj = {
	hello: 'hi',
	why: '나만 에러',
}
const example2: Example = obj; // 에러 안남
interface Money {
	amount: number;
	unit: string;
}

const money = { amount: 1000, unit: 'won', error: '에러 아님' };

function addMoney(money1: Money, money2: Money): Money {
	return (
		amount: money1.amount + money2.amount,
		unit: 'won',
	}
}
addMoney(money, { amount: 3000, unit: 'money', error: '에러' });

함수에서도 동일한 현상이 발생한다.

인수 자리에 변수로 값을 대입하면 에러가 발생하지 않지만, 객체 리터럴을 대입하면 에러가 발생한다.

이러한 현상이 발생하는 이유는 객체 리터럴을 대입할 때와 변수를 대입할 때 타입스크립트가 다르게 처리하기 때문이다.

객체 리터럴을 대입하면 잉여 속성 검사가 실행되는데 이것은 타입 선언에서 선언하지 않은 속성을 사용할 때 에러를 표시하는 것을 의미한다.

변수를 대입하면 객체 간 대입 가능성을 비교한다. (2.13절에서 자세히 알아본다고 함)