2015-12-29 11 views
5

Ich versuche in meinem Node-Projekt mit Typescript zu arbeiten, habe aber einige Probleme damit.NodeJS + TypeScript: Unklare Syntax mit Typ Skript Kompilierter Code

Das ist mein index.ts Datei:

import express from 'express'; 

const app = express(); 

Ich bin mit:

tsc --module commonsjs -d index.ts 

Meine Ausgabe ist index.js:

var express_1 = require('express'); 
var app = express_1["default"](); 

Wo diese ["default"] tat kam von? Es macht meinen Code nicht ordnungsgemäß ausgeführt:

var app = express_1["default"](); 
          ^

TypeError: express_1.default is not a function 

Soweit ich verstehe ich haben soll, den Code ohne die „default“ Klammern bekommen und es wäre fein gearbeitet haben - ich versuchte, die Klammern zu entfernen und es funktionierte.

Was fehlt mir hier?

Antwort

5

wäre die sicherste Lösung:

import express = require('express'); 

Diese transpiles zu:

var express = require('express'); 

Die offizielle Dokumentation für den Import benötigen Erklärungen here gefunden werden kann.

Ich glaube, typescript erwartet einen Export namens "default" als Code oben, nach dem letzten Absatz here zu urteilen.


Randnotiz, sieht aus wie neueste Version des Typoskript ([email protected] zum Zeitpunkt des Schreibens) eine Warnung auf einem Kompilierung Versuch werfen, die einen fehlenden Standard verwenden würden versuchen:

index.ts(1,8): error TS1192: Module '"express"' has no default export. 

Side Note 2 ist ein Beispiel von Microsoft die import * as express from 'express'; Syntax kann here finden. Wenn Sie ein Modul von commonjs (in diesem Beispiel they are) anvisieren, wird dies auch auf var express = require('express'); übertragen.

+1

'Import *' ist die falsche Methode zum Importieren von Legacy-Modulen. Siehe http://stackoverflow.com/a/29598404/252087. –

2

Wenn Sie versuchen, den Standardexport eines Nicht-ES6-Moduls wie Express zu verwenden, müssen Sie die Legacy-Importsyntax import express = require('express') verwenden. In ES6-Modulen gibt es keinen Standardwert-Export wie die module.exports von Node.js-Module oder die return von AMD-Module; Der Standard-Export eines ES6-Moduls ist nur der Schlüssel default. Wenn Sie daher einen ES6-Standard import verwenden, während Sie dies versuchen, generiert TypeScript JavaScript mit einem Zugriff auf die Eigenschaft default.

Weitere Informationen hierzu finden Sie unter New es6 syntax for importing commonjs/amd modules i.e. `import foo = require('foo')`.

+0

Danke! Ich habe dank dir etwas recherchiert. – Shikloshi

+0

Ich verstehe nicht, warum Sie die andere Antwort als die richtige Antwort akzeptiert haben. Es ist die falsche Antwort. –

+0

Wenn es wirklich die falsche Antwort für die aktuelle Version von Typescript ist, schlage ich vor, dass Sie Microsoft ihre Beispiele bearbeiten lassen. – dvlsg