Typescript 1.8 - импорт ES2015 в файлы js

Я хотел бы начать использовать Typescript в существующем проекте Babel. Моя цель — иметь возможность добавлять машинописный текст в процесс сборки с минимальными изменениями существующего кода. По этой причине я решил связать машинописный текст (нацеленный на ES2015) и Babel. Я думал, что с поддержкой js-файлов в ts1.8 наконец-то смогу сохранить все как есть, а затем конвертировать файлы один за другим. Но вот первая проблема, с которой я столкнулся:
error TS8003: 'export=' can only be used in a .ts file.

Typescript не поддерживает синтаксис экспорта es2015:
export default 'foo';.
Мы используем синтаксис es2015 для импорта/экспорта, и я не хочу менять его для старого синтаксиса commonJS. Есть ли способ заставить машинописный текст разрешить это?

Вот минимальный пример, демонстрирующий проблему:

hello.js

export default (name) => console.log(`Hello ${name}`);

tsconfig.json

{
    "version": "1.8",
    "compilerOptions": {
        "module": "es2015",
        "allowJs": true,
        "target": "es2015"
    }
}

командная строка (используя typescript 1.8)

tsc --outDir ../out

результат

hello.js(1,1): error TS8003: 'export=' can only be used in a .ts file.


person Tom Esterez    schedule 01.02.2016    source источник
comment
Кажется, есть небольшая путаница. export default 'foo'; для экспорта. Затем вам нужно импортировать с соответствующим синтаксисом: import foo from "./jsfile";   -  person Zorgatone    schedule 01.02.2016
comment
В любом случае посмотрите здесь пример синтаксиса github.com/Microsoft/TypeScript/issues/2242   -  person Zorgatone    schedule 01.02.2016
comment
конечно, я в курсе. Я отредактирую свой вопрос, чтобы избежать путаницы   -  person Tom Esterez    schedule 01.02.2016
comment
В прошлый раз, когда я проверял, я был уверен, что typescript разрешает синтаксис модулей ES6. Я установил typescript@next из npm, но и последняя версия тоже должна работать. Какую именно ошибку выдает?   -  person Zorgatone    schedule 01.02.2016
comment
один мой вопрос: error TS8003: 'export=' can only be used in a .ts file.   -  person Tom Esterez    schedule 01.02.2016
comment
Читай внимательно. Он говорит export= isn't allowed, что означает, что есть еще один файл, все еще использующий синтаксис commonJS. Это не означает, что вы не можете использовать синтаксис ES6.   -  person Zorgatone    schedule 01.02.2016
comment
Также вы уверены, что вам нужно связать Typescript и Babel? Typescript уже конвертирует свой код из ES6 в ES5. Не должно быть необходимости связывать их цепью. Также проверьте конфигурацию машинописного текста, синтаксис модуля которого является целевым выходом (UMD, AMD, CommonJS,...)   -  person Zorgatone    schedule 01.02.2016
comment
По какой-то причине он отображает эту ошибку export= для этого кода в файле js: function MyFunction() {} export default MyFunction, но не для export default function MyFunction() {}.   -  person David Sherret    schedule 01.02.2016
comment
@Zorgatone Я отредактировал свой вопрос, чтобы добавить и привести пример. И да, мне нужен Бабель. По крайней мере на данный момент. Это небольшой проект, в котором интенсивно используются полифиллы Babel, а машинописный текст еще не поддерживает все, что мы используем.   -  person Tom Esterez    schedule 01.02.2016
comment
Попробуйте изменить "module": "commonjs" на "module": "es2015"   -  person Zorgatone    schedule 01.02.2016
comment
Тогда обязательно используйте ES6, а не CommonJS в hello.js   -  person Zorgatone    schedule 01.02.2016
comment
@Zorgatone на примере моего вопроса, я получаю тот же результат   -  person Tom Esterez    schedule 01.02.2016
comment
@TomEsterez Ты уверен? Первый с выводом commonjs в синтаксисе commonjs (т.е. exports =) без ошибок. Я изменил его на es2015 и вывел es2015 без ошибок (т.е. экспорт по умолчанию...)   -  person Zorgatone    schedule 01.02.2016
comment
хм, вы сгенерировали export default, но что вы вложили? Моя цель - сохранить export default в моих исходных файлах js.   -  person Tom Esterez    schedule 01.02.2016
comment
Я скопировал ту же команду, которую вы использовали. Я только что изменил tsconfig.json с "module": "commonjs" на "module": "es2015". У меня не было такой ошибки, как вы сказали. Просто код выводился как CommonJS вместо ES2015. Вы уверены, что ваша ошибка вызвана TypeScript, а не BabelJS?   -  person Zorgatone    schedule 01.02.2016
comment
О, знаешь что? Вы назвали его hello.js вместо hello.ts   -  person Zorgatone    schedule 01.02.2016
comment
@Zorgatone весь смысл вопроса Тома в том, что у него много файлов .js, которые он не хочет менять. Он использует новый флаг allowJs.   -  person David Sherret    schedule 01.02.2016
comment
О, я думал, что он не хочет менять экспорт ES6 на CommonJS-подобный TS (т.е. Exports=). Тогда зачем вам компилировать это с помощью tsc? я не понимаю   -  person Zorgatone    schedule 01.02.2016
comment
@Zorgatone прочитал об этом здесь. Кроме того, использование экспорта по умолчанию (export default) также приведет к ошибке export =. Он хочет по-прежнему выводить модули es6, а не commonjs.   -  person David Sherret    schedule 01.02.2016
comment
Вот почему я предложил изменить вывод с commonjs на es6z, я все равно этого не знал   -  person Zorgatone    schedule 01.02.2016


Ответы (1)


Ошибка, которую вы получаете для default export, является ошибкой в ​​компиляторе TypeScript. Я отправил исправление после того, как вы зарегистрировали эту проблему.

Если вы хотите указать корневой модуль в файлах JavaScript (что нестандартно и специфично для определенных загрузчиков модулей, таких как CommonJS), способ сделать это такой же, как и в JavaScript:

module.exports = yourRootExportObjectHere;

Компилятор должен распознавать и учитывать их как эквивалентные объявлениям export =.

person Daniel Rosenwasser    schedule 01.02.2016
comment
Итак, я получаю неправильную ошибку, но должен ли я получить ошибку? Наконец, мне разрешено писать export default в файлах .js? - person Tom Esterez; 02.02.2016
comment
Нет, вы не должны получить ошибку с этим экспортом по умолчанию.. Исправление внесено, поэтому попробуйте завтра ночную сборку с npm install -g typescript@next. - person Daniel Rosenwasser; 02.02.2016
comment
Завтра тогда протестирую. Спасибо за вашу помощь! - person Tom Esterez; 02.02.2016
comment
Я попробовал ночные клубы, и, похоже, это сработало. Можешь подтвердить? - person Daniel Rosenwasser; 03.02.2016