TypeScript. Symbols (Символы)

Символы (Symbols) - это новый тип данных, который появился в редакции ECMAScript 2015. Примитивы символьного типа являются уникальными и неизменяемыми. Создаются с использованием конструктора Symbol:

let s1 = Symbol(); 
let s2 = Symbol('описание символа');

В качестве параметра конструктор Symbol принимает необязательную строку - описание символа. Это описание может быть полезно при отладке. Доступ к символу по данному параметру невозможен.

Символы являются уникальными и неизменяемыми:

let s3 = Symbol('символ'); 
let s4 = Symbol('символ');
console.log(s3 === s4); // false

А также их можно использовать в качестве ключей для свойств объектов:

let s = Symbol();    
let obj = {
    [s]: 'qwerty123'
};    

Символьное свойство объекта добавляется в квадратных скобках для того, чтобы оно не было принято за строковое.

Тут, как я понимаю, и заключается основное назначение символов. Теперь доступ к данному свойству возможен только по ссылке на данный символ:

let secret_key = obj[s]; // 'qwerty123'

По-другому получить доступ мы не сможем:

let secret_key2 = obj['s']; // undefined
let secret_key3 = obj.s; // undefined

Такое свойство не будет видно в for-in, Object.keys, Object.getOwnPropertyNames, а также его не будет и при использовании JSON.stringify. Таким образом, мы получаем некое подобие приватных свойств объекта. Не совсем, конечно, приватных, ибо есть таки возможность получить все символьные свойства объекта, воспользовавшись Object.getOwnPropertySymbols(), но очень похоже.

Уникальность символов же позволяет избежать возможного перекрытия свойств объекта. Таким образом, можно дополнять объекты новыми свойствами и не боятся возможного возникновения конфликтов имен.

Помимо пользовательских символов есть ряд системных, таких как Symbol.iterator или Symbol.replace. Полный их список можно глянуть в официальной документации Javascript или TypeScript.