Búsqueda de sitios web

javascript - "Los literales BigInt no están disponibles cuando se apunta a una versión inferior a ESNext"


Instalé React y TypeScript usando yarn create react-app my-app --typescript.

Entonces escribí este código:

import React from 'react';

const App: React.FC = () => {
  const theBiggestInt = 9007199254740991n;
  return (
    <div>
   {"Durkurian"}
    </div>
  );
}

export default App;

y obtuve un error:

Los literales BigInt no están disponibles cuando se apunta a una versión inferior a ESNext.

¿Cuál es el problema? ¿Cómo lo soluciono?

package.json

{
  "name": "my-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@types/jest": "24.0.17",
    "@types/node": "12.7.2",
    "@types/react": "16.9.2",
    "@types/react-dom": "16.8.5",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "react-scripts": "3.1.1",
    "typescript": "3.5.3"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

Respuesta #1

BigInt está habilitado en node_modules/typescript/lib/lib.es2020.bigint.d.ts, por lo que es parte de es2020 y no parte de esnext.

Sin embargo, parece que la expresión léxica ***n no forma parte de lib.es2020.bigint.d.ts. De hecho, eso es habilitado por esnext.

Para habilitar el uso de TypeScript con BigInt pero sin expresiones léxicas ****n, esta configuración funcionó:

{
  "compilerOptions": {
    "lib": [
      "es2020"
    ],
    "module": "commonjs",
    "target": "es2020",
}

Agregar "esnext" a las libs:

{
  "compilerOptions": {
    "lib": [
      "es2020", "esnext"
    ],
    "module": "commonjs",
    "target": "es2020",
}

luego habilita(*) la capacidad de '****n' expresiones léxicas.

(*) Otro tema separado es que VSCode (si estás trabajando con eso) a veces habilita de manera opaca '****n' como una expresión válida, incluso cuando 'esnext' nunca se menciona explícitamente en el archivo tsconfig.json relevante. ¿Quizás lo está habilitando esnext implícitamente? Ese comportamiento en realidad no es útil al tratar de averiguar exactamente qué configuraciones habilitan las expresiones léxicas ***n; después de agregar esnext a un archivo tsconfig y luego eliminarlo, la capacidad de usar expresiones ****n continuó de todas formas.

Respuesta #2

Como se señaló en un comentario, Bigint es una nueva característica. No puedes usar BigInt mientras tengas la propiedad target en tsconfig.json con un valor distinto a ESNext. Pero no deberías hacer esto porque hay poco soporte en navegadores según developer.mozilla.org y caniuse.com.

Artículos relacionados