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

js
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
js
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

js
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
js
const a = BigInt.asIntN(4, 8n);
const b = new BigInt64Array(3).fill(3n);

Voir aussi