TypeError: can't convert BigInt to number

L'exception JavaScript "can't convert BigInt to number" se produit lorsqu'une opération arithmétique porte sur un mélange de valeurs BigInt et Number.

Message

TypeError: Cannot mix BigInt and other types, use explicit conversions (moteur basé sur V8)
TypeError: BigInts have no unsigned right shift, use >> instead (moteur basé sur V8)
TypeError: can't convert BigInt to number (Firefox)
TypeError: Invalid mix of BigInt and other type in addition/multiplication/…. (Safari)
TypeError: BigInt does not support >>> operator (Safari)

Type d'erreur

Quel est le problème ?

Les deux opérandes d'un opérateur arithmétique doivent tous les deux être des grands entiers ou tous les deux être des nombres. Si une opération porte sur un mélange des deux, on ne sait pas si le résultat devrait être un grand entier ou un nombre, car les deux cas causeraient une perte de précision.

L'erreur peut également se produire lorsque l'opérateur de décalage non signé à droite (>>>) est utilisé entre deux valeurs BigInt. Dans Firefox, le message est le même : "can't convert BigInt to number".

Exemples

Mélanger des nombres et des grands entiers dans des opérations

js
const somme = 1n + 1;
// TypeError: can't convert BigInt to number

À la place, on convertira explicitement l'un des deux opérandes en nombre ou en grand entier.

js
const somme = 1n + BigInt(1);
const somme2 = Number(1n) + 1;

Utiliser un décalage à droite non signé sur des grands entiers

js
const a = 4n >>> 2n;
// TypeError: can't convert BigInt to number

On utilisera un décalage à droite normal à la place.

js
const a = 4n >> 2n;

Voir aussi