개발자 린다씨 2023. 1. 7. 14:00
반응형

symbol

symbol(심벌)은 ES2015에 새로 추가된 기능입니다.

실무에선 자주 사용하지 않는 편이며 객체와 맵에서 문자열 키를 대신하는 용도로 사용합니다.

 

symbol 키를 사용하면, 사람들이 잘 알려진 키만 사용하도록 강제할 수 있으므로 키를 잘못 설정하는 실수를 방지합니다.

 

객체의 기본 반복자(Symbol.iterator)를 설정하거나 객체가 어떤 인스턴스인지(Symbol.hasInstance)를 런타임에 오버라이딩 하는 것과 비슷한 기능을 제공합니다.

 

symbol 타입으로는 할 수 있는 동작이 별로 없습니다:(

let a = Symbol('a'); // symbol
let b: symbol = Symbol('b'); // symbol
var c = a === b; // boolean
let d = a + 'x'; // error TS2469: '+' 연산을 'symbol' 타입에 적용할 수 없음

JavaScript에서 Symbol('a')는 주어진 이름으로 새로운 symbol을 만든다는 의미입니다. 프리미티브 타입의 값을 담아서 사용합니다. (단, new Symbol로 사용할 수 없습니다.)

 

만들어진 symbol은 고유하고 수정 불가능하기 때문에 다른 symbol과 == 또는 ===로 비교했을 때, 같지 않다고 판단됩니다. (같은 이름으로 다른 symbol을 만들어도 마찬가지입니다.) 그래서 주로 접근을 제어하는데 쓰는 경우가 많습니다.

 

symbol도 symbol 타입으로 추론되거나 아니면 명시적으로 unique symbol을 정의할 수 있습니다.

const e = Symbol('e'); // typeof e
const f: unique symbol = Symbol('f'); //typeof f
let g: unique symbol = Symbol('f'); // error TS1332: 'unique symbol' 타입은 반드시 const 여야 합니다.

let h = e === e; // boolean
let i = e === f; // error TS2367: 'unique symbol' 타입은 서로 겹치는 일이 없으므로 이 비교문의 결과는 항상 'false'입니다.

unique symbol

  1. 새 symbol을 선언하고 const 변수에 할당하면, TypeScript가 unique symbol 타입으로 추론합니다. (코드 편집기에선 unique symbol이 아니라 'typeof 변수명' 형태로 보여줄 것입니다.)
  2. const 변수의 타입을 unique symbol로 명시적으로 정의합니다.
  3. unique symbol은 자신과 항상 같습니다.
  4. TypeScript는 컴파일 타임에 unique symbol이 다른 unique symbol과 같지 않을 것이라는 사실을 알 수 있습니다.

unique symbol도 결국 1, true, "literal" 등 다른 리터럴 타입과 마찬가지로 특정 symbol을 나타내는 타입입니다.

반응형