TypeError: can't convert x to BigInt
L'exception JavaScript "x can't be converted to BigInt" se produit lorsqu'on essaie de convertir un symbole, null
, ou undefined
en une valeur BigInt
, ou si une opération qui s'applique à un paramètre BigInt
reçoit un nombre.
Message
TypeError: Cannot convert null to a BigInt (moteur JavaScript basé sur V8) TypeError: can't convert null to BigInt (Firefox) TypeError: Invalid argument type in ToBigInt operation (Safari)
Type d'erreur
Quel est le problème ?
Lorsqu'on utilise la fonction BigInt()
afin de convertir une valeur en grand entier, la valeur doit d'abord être convertie en une valeur primitive. Une fois cette conversion effectuée, si la valeur n'est pas un grand entier, une chaîne de caractères, un nombre ou un booléen, une erreur est levée.
Certaines opérations, comme BigInt.asIntN()
, prennent uniquement un grand entier en paramètre, leur passer un nombre à la place déclenchera la même erreur.
Exemples
Utiliser BigInt()
sur des valeurs invalides
const a = BigInt(null);
// TypeError: can't convert null to BigInt
const b = BigInt(undefined);
// TypeError: can't convert undefined to BigInt
const c = BigInt(Symbol("1"));
// TypeError: can't convert Symbol("1") to BigInt
const a = BigInt(1);
const b = BigInt(true);
const c = BigInt("1");
const d = BigInt(Symbol("1").description);
Note : Le simple fait de convertir la valeur en un nombre ou en une chaîne de caractères à l'aide de String()
ou Number()
avant de la passer à BigInt()
ne sera généralement pas suffisant pour éviter toutes les erreurs. En effet, si la chaîne n'est pas une chaîne de caractères valide pour décrire un nombre entier, c'est une exception SyntaxError
qui sera levée ; si le nombre n'est pas un entier (c'est notamment le cas de NaN
), c'est une exception RangeError
qui sera levée. Si le domaine de la valeur d'entrée est inconnu, on veillera à la valider correctement avant d'utiliser BigInt()
.
Passer un nombre à une opération qui utilise un grand entier
const a = BigInt.asIntN(4, 8);
// TypeError: can't convert 8 to BigInt
const b = new BigInt64Array(3).fill(3);
// TypeError: can't convert 3 to BigInt
const a = BigInt.asIntN(4, 8n);
const b = new BigInt64Array(3).fill(3n);