{}에 toString 메서드를 호출하면 [object Object]로 변환됩니다. ({}).toString()해보면 됩니다. 따라서 obj[{}]는 wow가 됩니다.
다만 타입스크립트에서는 배열의 타이핑을 위해 속성 키를 number로 하는 것을 허용합니다. 따라서 타입스크립트에서 속성 키로 가능한 타입은 string과 symbol, number가 됩니다. number는 자바스크립트에서 string으로 변환되고요.
한 가지 더 알아두어야 할 점이 있습니다. 2.7.4절에서 {} 타입은 객체의 타입이 아니라 null과 undefined를 제외한 모든 타입을 의미한다고 말했는데요. 속성이 없는 인터페이스도 비슷한 역할을 합니다.
interface NoProp {}
const obj: NoProp = {
why: '에러 안 남',
}
const what: NoProp = '이게 되네?';
const omg: NoProp = null;
// Type 'null' is not assignable to type 'NoProp'.
null과 undefined를 제외한 값을 대입할 수 있습니다. 이렇게 만든 이유는 일반적으로 속성이 하나도 없는 빈 객체로 타입을 선언할 일이 없기 때문입니다. 따라서 빈 객체 타입을 특별하게 null과 undefined를 제외한 모든 값을 가리키는 타입으로 만들었습니다.