2015-12-29 4 views
5

Я пытаюсь работать с Typcript в моем проекте узла, но с некоторыми проблемами с этим.NodeJS + TypeScript: нечеткий синтаксис с типом скрипта скомпилированный код

Это мой index.ts файл:

import express from 'express'; 

const app = express(); 

Я бегу:

tsc --module commonsjs -d index.ts 

Мой выход index.js:

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

Откуда этот ["default"] пришел из? Это делает мой код не работает должным образом:

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

TypeError: express_1.default is not a function 

Насколько я понимаю, что я должен получить код без скобок «по умолчанию», и было бы прекрасно работали - я попытался удалить скобки, и она работала.

Что мне здесь не хватает?

ответ

5

Самым безопасным решением было бы:

import express = require('express'); 

Это transpiles к:

var express = require('express'); 

Официальная документация для импорта требуют декларации можно найти here.

Я считаю, что машинопись предполагает экспорт с именем «по умолчанию» для работы в качестве вашего кода выше, судя по последнему абзацу here.


Примечание стороны, выглядит последнюю версия машинописи (в [email protected] на момент написания) выбросит предупреждение о попытке компиляции, который будет пытаться использовать отсутствующий по умолчанию:

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

примечание стороны 2, пример из Microsoft с помощью синтаксиса import * as express from 'express'; можно найти here. При таргетинге на модуль commonjs (как в этом примере they are) это также будет переведено на var express = require('express');.

+1

'import *' - неправильный способ импорта устаревших модулей. См. Http://stackoverflow.com/a/29598404/252087. –

2

Если вы пытаетесь использовать экспорт по умолчанию не-ES6-модуля, такого как Express, вам нужно использовать старый синтаксис импорта import express = require('express'). В модулях ES6 отсутствует экспорт значений по умолчанию, например module.exports модулей Node.js или return модулей AMD; экспорт по умолчанию модуля ES6 - это только ключ default. Вот почему, когда вы используете ES6 по умолчанию import, как вы пытаетесь сделать, TypeScript генерирует JavaScript с доступом к свойству default.

Более подробную информацию об этом можно получить по телефону New es6 syntax for importing commonjs/amd modules i.e. `import foo = require('foo')`.

+0

Спасибо! Благодаря этому я провел несколько исследований по этому вопросу. – Shikloshi

+0

Я не понимаю, почему вы приняли другой ответ в качестве правильного ответа. Это неправильный ответ. –

+0

Если это действительно неверный ответ для текущей версии Typcript, я предлагаю вам изменить их примеры на Microsoft. – dvlsg