구조적 타이핑과 잉여 속성 체크

타입스크립트는 변수에 직접적으로 할당되는 객체 리터럴에 대해서만 잉여 속성 체크를 수행한다.

임시 변수를 사용하여 객체 리터럴을 할당한 경우에는 이 임시 변수의 타입이 할당 대상 타입과 호환이 되는지 여부(구조적 타이핑)만 체크한다.

interface Room {
	numDoors: number;
	ceilingHeightFt: number;
}

const r1: Room = {
	numDoors: 1,
	ceilingHeightFt: 10,
	elephant: 'present',
// ~~~~~~~~~~~~~~~~~~~ 개체 리터럴은 알려진 속성만 지정할 수 있으며
//                     'Room' 형식에 'elephant' 이(가) 없습니다. 
}

const obj = {
	numDoors: 1,
	ceilingHeightFt: 10,
	elephant: 'present',
};
const r2: Room = obj // 정상

예시 하나 더

interface Options {
	title: string;
	darkMode?: boolean;
}

/* 구조적 타이핑 */
const o1: Options = document; // 정상
const o2: Options = new HTMLAnchorElement; // 정상

/* 잉여 속성 체크 */
const o: Options = { darkmode: true, title: 'Ski Free' };
			       // ~~~~~~ 'Options' 형식에 'darkmode'이(가) 없습니다.

잉여 속성 체크가 사용되지 않는 경우

  1. 임시 변수를 사용하여 할당하는 경우
  2. 타입 단언문을 사용하는 경우
  3. 인덱스 시그니처를 사용하여 추가적인 속성을 예측하도록 하는 경우
interface Options {
	darkMode?: boolean
	[otherOptions: string]: unknown
}

onst o: Options = { darkmode: true } // 정상