객체의 속성에도 옵셔널이나 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절에서 자세히 알아본다고 함)