2015-12-29 17 views
5

Sto provando a lavorare con Typescript nel mio progetto nodo ma ho qualche problema.NodeJS + TypeScript: sintassi non chiara con codice script scritto tipo

Questo è il mio file index.ts:

import express from 'express'; 

const app = express(); 

Sto correndo:

tsc --module commonsjs -d index.ts 

La mia uscita è index.js:

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

Dove ha fatto questo è venuto ["default"] a partire dal? Si tratta di fare il mio codice non funzionare correttamente:

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

TypeError: express_1.default is not a function 

Per quanto ho capito che avrei dovuto ottenere il codice senza le parentesi di "default" e che avrebbe funzionato bene - Ho provato a rimuovere le staffe e ha funzionato.

Cosa mi manca qui?

risposta

5

La soluzione più sicura sarebbe:

import express = require('express'); 

Questo transpiles a:

var express = require('express'); 

La documentazione ufficiale per l'importazione richiedono dichiarazioni possono essere trovati here.

Credo che il dattiloscritto si aspetti un'esportazione denominata "default" per funzionare come il proprio codice sopra, a giudicare dall'ultimo paragrafo here.


Nota a margine, si presenta come versione più recente del dattiloscritto ([email protected] al momento della scrittura) lancerà un avviso su un tentativo di compilazione, che avrebbe tentato di utilizzare un default mancante:

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

Nota a margine 2, un esempio da Microsoft utilizzando la sintassi import * as express from 'express'; può essere trovato here. Quando si targetizza un modulo di commonjs (come they are in questo esempio), questo verrà anche trasmesso a var express = require('express');.

+1

'import *' è il modo sbagliato per importare i moduli legacy. Vedi http://stackoverflow.com/a/29598404/252087. –

2

Se si sta tentando di utilizzare l'esportazione predefinita di un modulo non ES6 come Express, è necessario utilizzare la sintassi di importazione legacy import express = require('express'). Nei moduli ES6 non esiste un'esportazione di valore predefinito come il module.exports dei moduli Node.js o lo return dei moduli AMD; l'esportazione predefinita di un modulo ES6 è solo la chiave default. Questo è il motivo per cui, quando si utilizza un valore predefinito ES6 import come si sta tentando di fare, TypeScript genera JavaScript con un accesso alla proprietà default.

Ulteriori informazioni a riguardo sono disponibili allo New es6 syntax for importing commonjs/amd modules i.e. `import foo = require('foo')`.

+0

Grazie! Ho fatto delle ricerche sull'argomento grazie a te. – Shikloshi

+0

Non capisco perché hai accettato l'altra risposta come risposta corretta. È la risposta sbagliata –

+0

Se è veramente la risposta sbagliata per la versione corrente di Typescript, allora suggerisco che Microsoft abbia modificato i loro esempi. – dvlsg

Problemi correlati