Typescript ReferenceError: exports ist nicht definiert

Beim Versuch, ein Modul gemäß dem offiziellen Handbuch zu implementieren, erhalte ich diese Fehlermeldung:

Ungefangener ReferenceError: exports ist nicht definiert

bei app.js:2

Aber nirgendwo in meinem Code verwende ich den Namen exports.

Wie kann ich das beheben?


Dateien

app.ts

let a = 2;
let b:number = 3;

import Person = require ('./mods/module-1');

module-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"
    ]
}

Einige andere Lösungen für dieses Problem

  • Fügen Sie die folgende Zeile vor anderen Verweisen auf Javascript ein. Dies ist ein netter kleiner Hack.
   <script>var exports = {};</script>
  • Dieses Problem tritt bei der neuesten Version von TypeScript auf. Der Fehler kann mit der TypeScript-Version 2.1.6 behoben werden.
Kommentare (2)
Lösung

EDIT:

Diese Antwort könnte nicht funktionieren, wenn Sie nicht mehr auf es5 abzielen, ich werde versuchen, die Antwort vollständiger zu machen.

Original-Antwort

Wenn CommonJS nicht installiert ist (welches exports definiert), müssen Sie diese Zeile aus Ihrer tsconfig.json entfernen:

 "module": "commonjs",

Wie aus den Kommentaren hervorgeht, kann es sein, dass dies allein mit späteren Versionen von tsc nicht funktioniert. Wenn das der Fall ist, können Sie einen Modul-Loader wie CommonJS, SystemJS oder RequireJS installieren und diesen dann angeben.

Hinweis:

Schauen Sie sich Ihre main.js-Datei an, die tsc erzeugt hat. Sie werden dies ganz oben finden:

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

Das ist die Ursache der Fehlermeldung, und nach dem Entfernen von "module": "commonjs",, wird sie verschwinden.

Kommentare (18)

Ich hatte das gleiche Problem und löste es, indem "es5" Bibliothek zu tsconfig.json wie folgt:

{
    "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"
        ]
    }
}
Kommentare (0)