Що робить тип symbol?
Що робить тип symbol у TypeScript
Тип symbol представляє унікальне і незмінне значення,
яке часто використовується як ідентифікатор (ключ) для властивостей об'єктів.
Він був доданий у ES2015 (ES6) і підтримується TypeScript з самого початку.
Суть symbol
Щоразу, коли ти створюєш Symbol(), він генерує унікальне значення, навіть якщо передати однаковий опис (опис - просто мітка для налагодження).
const id1 = Symbol("user");
const id2 = Symbol("user");
console.log(id1 === id2); // false - символи унікальні!Тобто навіть при однаковій назві "user" - це різні символи.
Як оголосити змінну типу symbol
1. Неявно (TS сам виведе тип):
const token = Symbol("auth"); // тип: symbol2. Явно вказавши тип:
let key: symbol = Symbol("key");Символи як ключі об'єктів
symbol часто використовується, щоб додати унікальну властивість до об'єкта,
яку не буде випадково перезаписано або показано під час ітерації.
const ID = Symbol("id");
const user = {
name: "Tim",
[ID]: 12345,
};
console.log(user.name); // "Tim"
console.log(user[ID]); // 12345Властивості з ключем-символом не видно під час перебору через
for...inабоObject.keys():javascriptconsole.log(Object.keys(user)); // ["name"]
Навіщо потрібен symbol
- Для захисту даних - унікальні властивості, які не можна випадково затерти.
- Для створення "прихованих" ключів у бібліотеках, щоб не перетинатися з чужими властивостями.
- Для опису унікальних констант, особливо в enum-подібних структурах.
- Для метапрограмування - використовуються у спеціальних "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 |
Приклад:
const person = {
[Symbol.toPrimitive](hint) {
if (hint === "number") return 42;
return "Tim";
}
};
console.log(+person); // 42
console.log(`${person}`); // "Tim"Особливості та обмеження
- Символи не можна автоматично привести до рядка:
const s = Symbol("id");
console.log("ID: " + s); // TypeError
console.log(s.toString()); // "Symbol(id)"- Символи - унікальні, але можна отримати спільні (глобальні) через
Symbol.for():
const a = Symbol.for("shared");
const b = Symbol.for("shared");
console.log(a === b); // true - один і той самий глобальний символПідсумок
| Властивість | Опис |
|---|---|
| Тип | Примітив |
| Створюється через | Symbol() або Symbol.for() |
| Унікальність | Завжди унікальний (крім глобальних через Symbol.for) |
| Основне застосування | Унікальні ключі об'єктів, безпечні ідентифікатори |
| Приведення до рядка | Тільки вручну через .toString() |
| Доступ до значення | Тільки через [symbol], не через крапку |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.