잉여 속성 - 객체 리터럴의 속성 중 변수의 객체 타입에 선언된 속성에 포함되지 않는 속성
→ 변수에 객체 리터럴을 할당하는 경우, 할당할 객체 리터럴의 속성(프로퍼티) 중 잉여 속성이 있으면, 컴파일러 및 타입 체커가 에러를 발생시킨다.
→ 구조적 할당 가능한 검사와 잉여 속성 체크는 별도의 과정이다.
// 잉여 속성 체크
interface SomeInterface {
x: string;
y: string;
}
const someVariable:SomeInterface = { x: 'x', y: 'y', z: 'z' }
// 여기서 문제 발생, 잉여 속성 체크
/*
잉여 타입 체크 에러메시지
Type '{ x: string; y: string; z: string; }' is not assignable to type 'SomeInterface'.
Object literal may only specify known properties, and 'z' does not exist in type 'SomeInterface'.(2322)
*/
구조적 타이핑의 관점에서는 문제가 없다고 보일 수도 있지만,
객체 리터럴을 할당하는 과정에서 발생하는 잉여 속성 체크의 과정이다.
(따라서, 구조적 타이핑을 무시하는 예외적 경우이다.)
// 구조적 타이핑
interface SomeInterface {
x: string;
y: string;
}
const anotherVariable = { x: 'x', y: 'y', z: 'z' }
const someInterVariable:SomeInterface = anotherVariable; // 정상 동작
{ x: 'x', y: 'y', z: 'z' }
라는 객체 리터럴을 직접 할당하는 상황과, 객체 리터럴을 미리 변수에 할당하고 해당 변수를 할당하는 상황과 동작은 같지만, 타입스크립트는 다르게 해석하고 에러를 전자의 상황만 에러를 발생시킨다.