2016-05-19 2 views
0

Я хотел использовать столпотворение для преобразования вывода ES6 из машинописи и используется следующий синтаксис:Использование столпотворение превратить машинопись ES6 в глотке

var gulpBabel = require('gulp-babel'); 
var ts = require('gulp-typescript'); 
// ... 
function compileTypescript(fileSpec, folder) { 
    var options = {jsx: 'react', moduleResolution: 'node', target: 'ES6'} 
    return gulp 
     .src(fileSpec) 
     .pipe(sourcemaps.init()) 
     .pipe(ts(options)) 
     .pipe(gulpBabel({presets: ['react', 'es2015', 'stage-0']})) 
     .pipe(sourcemaps.write(".")) 
     .pipe(gulp.dest(folder)); 
} 

Это создает, казалось бы, правильный код, но что-то плохое происходит с импортом импорт, это т.с.-файл:

import * as express from 'express' 

... становится:

var _express = require('express'); 
var express = _interopRequireWildcard(_express); 

... который не работает при запуске в node.js. («Экспресс-это не функция») Когда я компилировать ES5 непосредственно в машинописи компилятора я получаю этот рабочий вывод:

var express = require('express'); 

Что я здесь делаю неправильно?

Примечание: Я хочу вывести ES6, так как некоторые библиотеки «типизации», express-handlebars в этом случае, предположим ES6. Я могу заставить это работать с использованием ES5 ts-output, но затем файл типизирования должен быть отредактирован вручную, чтобы включить символы es6-prom, которые не будут хорошо работать в моем конвейере сборки. Есть ли другие способы решения этой проблемы?

Примечание: Я использую ту же настройку Babel с моими обычными файлами javascript ES6, и это хорошо работает.

ответ

2

Это связано с тем, что TypeScript ожидает экспорт по умолчанию из express, но его нет.

Они added a allowSyntheticDefaultImports флаг в 1.8, чтобы адресовать это. Согласно docs:

Разрешить импорт по умолчанию из модулей без экспорта по умолчанию. Это делает не влияет на испускание кода, просто проверка типов.

Попробуйте передать его в качестве одного из вариантов:

var options = {jsx: 'react', moduleResolution: 'node', target: 'ES6', allowSyntheticDefaultOptions: true} 
+0

Спасибо, но моя проблема была на самом деле временем выполнения - компиляция продолжалась нормально. (Я также получил сообщение об ошибке с предложенным аргументом при передаче его в tsify.) Однако ваша ссылка на документацию привела med к ответу. –

0

Оказывается, что машинопись компилятор изменения опции по умолчанию для флага модуля при переключении на цели ES6. Похоже, это и есть причина. При креплении модуль опцию «CommonJS», код отлично работает с целью ES6 и вавилонских преобразований:

var options = {jsx: 'react', moduleResolution: 'node', target: 'ES6', 
    module: 'CommonJS'} 
    ------------------ 

Теперь я могу использовать этот ES6-зависимые типизации файл для «экспресс-рули» без коверкая д .ts-файл.

Смежные вопросы