또 특이한 점이 몇 가지 있습니다. 먼저 null과 undefined를 let 변수에 대입할 때는 any로 추론합니다. 이 점은 기억해두는 것이 좋습니다.
sym은 const일 때는 typeof sym이었는데, let일 때는 symbol입니다. typeof sym은 고유한 symbol을 의미합니다. const이므로 다른 symbol로 변경할 수 없는 symbol인 것이죠. 타입스크립트는 이를 unique symbol이라고 표현합니다. unique symbol끼리는 서로 비교할 수 없습니다. 다만 unique symbol과 일반 symbol끼리나, 두 개의 일반 symbol끼리는 비교할 수 있습니다.
const sym1 = Symbol.for('sym'); // unique symbol
const sym2 = Symbol.for('sym'); // unique symbol
let sym3 = Symbol.for('sym');
let sym4 = Symbol.for('sym');
if (sym1 === sym2) {}
// This comparison appears to be unintentional because the types 'typeof sym1' and 'typeof sym2' have no overlap.
if (sym3 === sym4) {}
if (sym2 === sym3) {}
앞의 예제는 자바스크립트에서는 문제가 없는 코드입니다. sym1 === sym2도 true입니다. 하지만 타입스크립트에서는 unique symbol끼리의 비교를 금지하고 있습니다.