bigint și symbol în TypeScript

Tipuri de bază TypeScript 3.2

bigint ține numere întregi oricât de mari; symbol este o valoare unică, folosită de obicei drept cheie de proprietate.

Sintaxă
let mare: bigint = 123n;
const cheie: symbol = Symbol("descriere");
const unic: unique symbol = Symbol();

Ce face bigint și symbol

bigint este tipul numerelor întregi fără limită de mărime. Un literal bigint se scrie cu n la final: 9007199254740993n. Un number obișnuit reprezintă exact doar întregi până la 253 − 1 (Number.MAX_SAFE_INTEGER). TypeScript nu te lasă să amesteci bigint cu number în aceeași operație; convertești explicit cu BigInt(x) sau Number(x).

symbol este tipul valorilor create cu Symbol(). Fiecare simbol este unic, chiar dacă are aceeași descriere, deci este bun drept cheie de proprietate care nu se poate ciocni cu alte chei. JavaScript are simboluri predefinite cu rol special, de exemplu Symbol.iterator (vezi iteratori) și Symbol.dispose (vezi using).

unique symbol este tipul unui anumit simbol, declarat cu const. Doar cu el poți folosi simbolul ca nume de proprietate într-o interfață sau clasă.

Exemple

Exemplul 1: Calcule cu bigint

Cu number, 253 + 1 pierde precizie; cu bigint rezultatul este exact.

const limita = Number.MAX_SAFE_INTEGER;
console.log(limita + 2);                 // number: rezultat inexact

const mare: bigint = BigInt(limita) + 2n;
console.log(mare);
console.log((mare * mare).toString());

let factorial = 1n;
for (let i = 1n; i <= 25n; i++) factorial *= i;
console.log("25! =", factorial.toString());

Rezultat

9007199254740992
9007199254740993n
81129638414606699710187514626049
25! = 15511210043330985984000000

Exemplul 2: Nu se amestecă bigint cu number

const a: bigint = 10n;
const b: number = 5;
console.log(a + b);

Eroarea afișată de tsc

exemplu.mts(3,13): error TS2365: Operator '+' cannot be applied to types 'bigint' and 'number'.

Exemplul 3: symbol drept cheie de proprietate

Proprietatea cu cheie simbol nu apare în JSON.stringify și nici în Object.keys.

const ID: unique symbol = Symbol("id");

interface Elev {
    nume: string;
    [ID]: number;
}

const ana: Elev = { nume: "Ana", [ID]: 1042 };
console.log(ana[ID], ana.nume);
console.log(JSON.stringify(ana), Object.keys(ana));
console.log(Symbol("id") === Symbol("id"));

Rezultat

1042 Ana
{"nume":"Ana"} [ 'nume' ]
false

Greșeli frecvente

  • Folosești bigint pentru bani. Nu are zecimale; pentru lei și bani păstrează sumele în bani (întregi) ca number, sau folosește o bibliotecă de zecimale.
  • Afișezi un bigint cu JSON.stringify: aruncă Do not know how to serialize a BigInt. Convertește-l întâi cu toString().

Comenzi înrudite

  • string, number, boolean: Cele trei tipuri primitive folosite cel mai des: texte, numere (întregi și zecimale) și valori adevărat/fals.
  • iteratori cu tipuri: Un obiect cu metoda [Symbol.iterator] se poate parcurge cu for…of; tipurile sunt Iterable<T> și Iterator<T>.
  • using (resurse): Declară o resursă care se eliberează automat la ieșirea din bloc, chiar dacă apare o eroare.
  • index signatures: Descrie obiecte cu chei necunoscute dinainte: [cheie: string]: Tip, sau Record<string, Tip>.