Estoy usando el ES6 Symbol en mi proyecto React Native. Esto funciona bien para iOS, pero en Android obtengo Can't find variable: Symbol.

Estoy usando TypeScript y probé varios tsconfig.json:

{
  "compilerOptions": {
    "target": "es2015",
    "jsx": "react",
    "lib": ["dom", "es7"],
    "moduleResolution": "node"
  },
}

También probé lib: ["dom", "es6"] y ["dom", "es6", "es7"], así como target: "es5".

¿Cómo puedo hacer que Symbol sea manejado adecuadamente por TypeScript para React Native en Android?

1
Explosion Pills 22 feb. 2018 a las 18:59

3 respuestas

La mejor respuesta

Puede usar import 'core-js/es6/symbol' sin tener que agregar una dependencia npm o copiar y pegar un polyfill

EDITAR: Dudo que sea un problema de TS. El tiempo de ejecución de Android JS no tiene soporte de Symbol. También tuve este problema en JSX simple y lo solucioné usando el fragmento pegado anteriormente.

3
Hunaid Hassan 22 feb. 2018 a las 16:43

Este es un problema de TypeScript en absoluto.

Te falta un polyfill.

Como transpiler, TypeScript transforma construcciones sintácticas para representar su comportamiento, pero no proporciona bibliotecas de tiempo de ejecución.

Instale un polyfill de símbolo es6 como este con su administrador de paquetes de elección y todo funcionará que estes bien.

Symbol es una biblioteca, y está fuera del alcance de la transpilación en general, al menos desde la perspectiva del equipo de TypeScript.

Parte de la motivación para esto es que puede elegir sus propias implementaciones de polyfill, lo que le brinda flexibilidad. Otro que viene a la mente es que a menudo se invoca un transpilador mucho antes de que tenga información suficiente para saber si podría excluir un polyfill.

Nota: su --target está configurado en es2015 pero está experimentando dificultades en algunas plataformas debido a que las bibliotecas que se especificaron en es2015 no son proporcionadas por el tiempo de ejecución. Le recomiendo que reduzca el uso de --target es5 por el momento.

Una cosa más que sugiero es ser coherente en su terminología de configuración.

"target": "es2015",
"lib": ["dom", "es7"],

Es confuso y debe cambiarse a

"target": "es2015",
"lib": ["dom", "es2016"],

Por el bien de la lectora

0
Aluan Haddad 22 feb. 2018 a las 16:47

Puede importarlos en su archivo raíz index.js sin instalar ninguna dependencia:

import "core-js/stable";
import "regenerator-runtime/runtime";
0
Gregory R. 13 jun. 2019 a las 07:37