Skip to main content

Що робить тип symbol?

Що робить тип symbol у TypeScript

Тип symbol представляє унікальне і незмінне значення, яке часто використовується як ідентифікатор (ключ) для властивостей об'єктів.

Він був доданий у ES2015 (ES6) і підтримується TypeScript з самого початку.


Суть symbol

Щоразу, коли ти створюєш Symbol(), він генерує унікальне значення, навіть якщо передати однаковий опис (опис - просто мітка для налагодження).

javascript
const id1 = Symbol("user"); const id2 = Symbol("user"); console.log(id1 === id2); // false - символи унікальні!

Тобто навіть при однаковій назві "user" - це різні символи.


Як оголосити змінну типу symbol

1. Неявно (TS сам виведе тип):

javascript
const token = Symbol("auth"); // тип: symbol

2. Явно вказавши тип:

javascript
let key: symbol = Symbol("key");

Символи як ключі об'єктів

symbol часто використовується, щоб додати унікальну властивість до об'єкта, яку не буде випадково перезаписано або показано під час ітерації.

javascript
const ID = Symbol("id"); const user = { name: "Tim", [ID]: 12345, }; console.log(user.name); // "Tim" console.log(user[ID]); // 12345

Властивості з ключем-символом не видно під час перебору через for...in або Object.keys():

javascript
console.log(Object.keys(user)); // ["name"]

Навіщо потрібен symbol

  1. Для захисту даних - унікальні властивості, які не можна випадково затерти.
  2. Для створення "прихованих" ключів у бібліотеках, щоб не перетинатися з чужими властивостями.
  3. Для опису унікальних констант, особливо в enum-подібних структурах.
  4. Для метапрограмування - використовуються у спеціальних "well-known symbols".

"Well-known symbols"

JavaScript має набір вбудованих символів, які дозволяють змінювати стандартну поведінку об'єктів:

СимволПризначення
Symbol.iteratorВизначає ітерацію об'єкта (for...of)
Symbol.toStringTagВизначає, що повертає Object.prototype.toString()
Symbol.hasInstanceВизначає поведінку instanceof
Symbol.toPrimitiveКонтролює перетворення об'єкта на примітив
Symbol.asyncIteratorДля асинхронних ітераторів
Symbol.match, Symbol.replace, Symbol.search, Symbol.splitДозволяють кастомізувати роботу з рядками та RegExp

Приклад:

javascript
const person = { [Symbol.toPrimitive](hint) { if (hint === "number") return 42; return "Tim"; } }; console.log(+person); // 42 console.log(`${person}`); // "Tim"

Особливості та обмеження

  1. Символи не можна автоматично привести до рядка:
javascript
const s = Symbol("id"); console.log("ID: " + s); // TypeError console.log(s.toString()); // "Symbol(id)"
  1. Символи - унікальні, але можна отримати спільні (глобальні) через Symbol.for():
javascript
const a = Symbol.for("shared"); const b = Symbol.for("shared"); console.log(a === b); // true - один і той самий глобальний символ

Підсумок

ВластивістьОпис
ТипПримітив
Створюється черезSymbol() або Symbol.for()
УнікальністьЗавжди унікальний (крім глобальних через Symbol.for)
Основне застосуванняУнікальні ключі об'єктів, безпечні ідентифікатори
Приведення до рядкаТільки вручну через .toString()
Доступ до значенняТільки через [symbol], не через крапку

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.