Mecanografía ReferenceError: exports no está definido

Al tratar de implementar un módulo siguiendo el manual oficial , recibo este mensaje de error:

Uncaught ReferenceError: exports no está definido

en app.js: 2

Pero en ningún lugar de mi código utilizo el nombre de exports .

¿Cómo puedo arreglar esto?


Archivos

aplicaciones

 let a = 2; let b:number = 3; import Person = require ('./mods/module-1'); 

módulo-1.t

  export class Person { constructor(){ console.log('Person Class'); } } export default Person; 

tsconfig.json

 { "compilerOptions": { "module": "commonjs", "target": "es5", "noImplicitAny": false, "sourceMap": true, "outDir": "scripts/" }, "exclude": [ "node_modules" ] } 

EDITAR:

Esta respuesta podría no funcionar, dependiendo de si ya no está apuntando a es5 , intentaré completar la respuesta.

Respuesta original

Si CommonJS no está instalado (lo que define las exports ), debe eliminar esta línea de su tsconfig.json :

  "module": "commonjs", 

Según los comentarios, esto solo puede no funcionar con las versiones posteriores de tsc . Si ese es el caso, puede instalar un cargador de módulos como CommonJS, SystemJS o RequireJS y luego especificar eso.

Nota:

Mire su archivo main.js que se generó. Encontrará esto en la parte superior:

 Object.defineProperty(exports, "__esModule", { value: true }); 

Es la raíz del mensaje de error, y después de eliminar "module": "commonjs", , se desvanecerá.

Pocas otras soluciones para este problema

  • Agregue la siguiente línea antes de otras referencias a Javascript. Este es un buen truco.
   
  • Este problema ocurre con la última versión de TypeScript; este error se puede eliminar al referirse a la versión de mecanografía 2.1.6

Para las personas que aún tienen este problema, si el objective del comstackdor está configurado en ES6, debe indicar a babel que omita la transformación del módulo. Para hacerlo, agregue esto a su archivo .babelrc

 { "presets": [ ["env", {"modules": false} ]] } 

Existe una relación entre la opción “módulo” y la opción “objective” en las opciones del comstackdor (como se documenta aquí ):

–module -m

cuerda

objective === “ES3” o “ES5”? “CommonJS”: “ES6”

Especifique la generación del código del módulo: “Ninguno”, “CommonJS”, “AMD”, “Sistema”, “UMD”, “ES6”, “ES2015” o “ESNext”. ► Solo “AMD” y “Sistema” se pueden usar junto con –outFile. ► Los valores “ES6” y “ES2015” pueden usarse cuando se apunta a “ES5” o inferior.

Como el valor predeterminado del módulo es condicional del objective, debe tener en cuenta las dos opciones y la forma en que lo está utilizando para cargar sus módulos y tener las opciones correctas que se ajusten a su código.

Si se dirige a ES5, debe considerar otra opción que no sea el valor predeterminado, y cambiar la forma en que carga su módulo en consecuencia.

La respuesta aceptada no resolvió el problema para mí. En cambio, me configuro para usar RequireJS (Implementación de AMD). Escribí mi solución en https://stackoverflow.com/a/48436147/1019307 .

Tuve el mismo problema y lo resolví añadiendo la biblioteca ” es5 ” a tsconfig.json de esta manera:

 { "compilerOptions": { "target": "es5", //defines what sort of code ts generates, es5 because it's what most browsers currently UNDERSTANDS. "module": "commonjs", "moduleResolution": "node", "sourceMap": true, "emitDecoratorMetadata": true, //for angular to be able to use metadata we specify in our components. "experimentalDecorators": true, //angular needs decorators like @Component, @Injectable, etc. "removeComments": false, "noImplicitAny": false, "lib": [ "es2016", "dom", "es5" ] } } 

Estaba realmente confundido cuando tuve que configurar un corredor de prueba por primera vez en un backend porque generalmente tengo esa configuración de antemano o tuve que configurar pruebas en el proyecto frontend.

Entonces pensé … que usar Karma para un proyecto de back-end era una buena idea * facepalm *.

Alerta de spoiler: no lo es. Karma siempre ejecutará sus pruebas en un navegador, pero su código de back-end debe ser leído por Node. Y la primera diferencia entre los 2, es que Node puede leer declaraciones de exports mientras que un navegador no puede.

Así que terminé usando ts-node (para soporte de Typescript), jasmine y watch para comenzar de nuevo todas las pruebas cuando actualizo un archivo.