Пошук уроків, статей та іншого контенту
Ознайомтеся з bigint і symbol, правилами їх створення та випадками, коли ці типи потрібні.
bigintbigint — примітивний тип для цілих чисел довільного розміру. На відміну від типу number, він дає змогу працювати з числами, які виходять за межі безпечного діапазону number.
Літерал bigint записують із суфіксом n:
const population: bigint = 8_000_000_000n;
const largeNumber = 123456789012345678901234567890n;
console.log(population);
console.log(largeNumber);Символ _ у числовому літералі лише покращує читабельність і не впливає на значення.
bigintЄ два основні способи створити значення типу bigint:
const first: bigint = 100n;
const second: bigint = BigInt(100);
console.log(first);
console.log(second);BigInt() може приймати ціле число або рядок із цілим числом:
const fromNumber = BigInt(42);
const fromString = BigInt("9007199254740993");
console.log(fromNumber); // 42n
console.log(fromString); // 9007199254740993nДля створення великих значень краще передавати рядок. Число типу number може втратити точність ще до перетворення на bigint.
bigintДля значень bigint доступні звичайні арифметичні операції:
const a = 10n;
const b = 3n;
console.log(a + b); // 13n
console.log(a - b); // 7n
console.log(a * b); // 30n
console.log(a / b); // 3n
console.log(a % b); // 1n
console.log(a ** 2n); // 100nДілення bigint націлене лише на цілі числа. Дробова частина відкидається:
const result = 7n / 2n;
console.log(result); // 3nbigint і number — різні типиНе можна безпосередньо виконувати арифметичні операції між bigint і number:
const count = 10n;
const step = 2;
// Помилка TypeScript:
// const result = count + step;Спочатку потрібно явно перетворити одне значення на інший тип:
const count = 10n;
const step = 2;
const result = count + BigInt(step);
console.log(result); // 12nАбо:
const largeValue = 100n;
const ordinaryValue = 20;
const result = Number(largeValue) + ordinaryValue;
console.log(result); // 120Перетворення bigint на number може призвести до втрати точності, якщо значення дуже велике.
Порівнювати bigint і number можна:
console.log(10n === 10); // false
console.log(10n == 10); // true
console.log(10n > 5); // trueСтроге порівняння === враховує типи, тому 10n і 10 не є однаковими значеннями.
bigintbigint доречний, коли програма працює з дуже великими цілими числами, наприклад:
великими ідентифікаторами;
фінансовими або криптографічними обчисленнями;
лічильниками, які можуть перевищити безпечний діапазон number;
даними, де важливо не втратити точність цілих чисел.
Для звичайних чисел, дробів і більшості повсякденних обчислень достатньо number.
Для використання bigint TypeScript має компілювати код із сучасною версією JavaScript. Зазвичай використовують target: "ES2020" або новішу версію:
{
"compilerOptions": {
"target": "ES2020",
"strict": true
}
}Якщо вибрано застарілу версію target, TypeScript може повідомити, що літерали bigint недоступні.
symbolsymbol — примітивний тип, значення якого є унікальним ідентифікатором.
Створити symbol можна за допомогою функції Symbol():
const firstId: symbol = Symbol();
const secondId: symbol = Symbol();
console.log(firstId === secondId); // falseНавіть якщо передати однаковий опис, символи все одно будуть різними:
const first = Symbol("user");
const second = Symbol("user");
console.log(first === second); // falseРядок "user" у цьому прикладі є лише описом символу. Він допомагає під час налагодження, але не робить символи однаковими.
Кожен виклик Symbol() створює нове унікальне значення:
const firstKey = Symbol("key");
const secondKey = Symbol("key");
const values = new Map<symbol, string>();
values.set(firstKey, "перше значення");
values.set(secondKey, "друге значення");
console.log(values.get(firstKey)); // перше значення
console.log(values.get(secondKey)); // друге значенняfirstKey і secondKey мають однаковий опис, але є різними ключами.
Символ можна використовувати як ключ властивості об’єкта:
const id = Symbol("id");
const user = {
name: "Олена",
[id]: 42
};
console.log(user.name); // Олена
console.log(user[id]); // 42Квадратні дужки [id] потрібні, щоб використати значення змінної id як ключ. Без них властивість отримала б текстове ім’я id, а не значення символу.
Такі властивості не конфліктують зі звичайними властивостями з рядковими ключами:
const internalId = Symbol("id");
const user = {
id: "public-id",
[internalId]: 123
};
console.log(user.id); // public-id
console.log(user[internalId]); // 123Це може бути корисно для внутрішніх метаданих, коли потрібно додати властивість і зменшити ризик випадкового збігу її імені з іншими властивостями.
symbol у TypeScriptДля змінних, які можуть містити будь-який символ, використовують тип symbol:
let key: symbol = Symbol("key");
key = Symbol("another-key");unique symbol описує конкретний унікальний символ. Такий тип найчастіше використовують для констант:
const applicationId: unique symbol = Symbol("applicationId");
console.log(applicationId);Значення з типом unique symbol не можна замінити іншим символом:
const first: unique symbol = Symbol("first");
// Помилка TypeScript:
// first = Symbol("second");Для початку достатньо запам’ятати:
symbol — тип символів загалом;
unique symbol — тип конкретного унікального символу.
Symbol.for() працює інакше, ніж звичайний Symbol(). Він використовує спільний глобальний реєстр символів:
const first = Symbol.for("user");
const second = Symbol.for("user");
console.log(first === second); // trueДля отримання ключа символу з глобального реєстру використовують Symbol.keyFor():
const userSymbol = Symbol.for("user");
console.log(Symbol.keyFor(userSymbol)); // userВиклик Symbol("user") не додає символ до цього реєстру:
const localSymbol = Symbol("user");
console.log(Symbol.keyFor(localSymbol)); // undefinedЗвичайний Symbol() створює новий символ, а Symbol.for() дає змогу повторно отримати той самий символ за ключем.
Оператор typeof повертає спеціальні результати для цих типів:
const largeNumber = 100n;
const identifier = Symbol("id");
console.log(typeof largeNumber); // bigint
console.log(typeof identifier); // symbolЦе можна використовувати для перевірки значення під час виконання:
function describeValue(value: bigint | symbol): string {
if (typeof value === "bigint") {
return `Велике ціле число: ${value}`;
}
return "Унікальний символ";
}
console.log(describeValue(100n));
console.log(describeValue(Symbol("id")));Усередині першої гілки TypeScript розуміє, що value має тип bigint, а після неї — що значення має тип symbol.
nconst value = 100; // number
const anotherValue = 100n; // bigint100 і 100n мають однакове числове представлення, але різні типи.
number і bigintconst total = 10n;
const increment = 1;
// Помилка:
// const result = total + increment;Потрібно явно виконати перетворення:
const result = total + BigInt(increment);console.log(5n / 2n); // 2nbigint зберігає лише цілі числа, тому результат дорівнює 2n, а не 2.5.
const first = Symbol("status");
const second = Symbol("status");
console.log(first === second); // falseОпис символу не є його ідентичністю. Якщо потрібен той самий символ, використовуйте одну змінну або Symbol.for().
Symbol через new// Помилка:
// const id = new Symbol("id");Symbol викликають як функцію:
const id = Symbol("id");bigint призначений для великих цілих чисел без втрати точності.
Літерали bigint мають суфікс n: 123n.
bigint не можна безпосередньо змішувати з number.
Під час ділення bigint дробова частина відкидається.
symbol створює унікальні примітивні значення.
Два виклики Symbol() завжди створюють різні символи.
Символи можна використовувати як ключі властивостей об’єктів.
Symbol.for() повертає спільний символ із глобального реєстру.
Для перевірки цих типів typeof повертає "bigint" і "symbol".