2016-01-23 2 views
1

машинописи компилятор, кажется, производит неправильный вывод, как показано ниже:машинопись компилятор выдает неверные результаты

export default class TitleParser {} 

Производит:

class TitleParser { 
} 
exports.TitleParser = TitleParser; 

Таким образом, проблема здесь в том, что я получаю сообщение об ошибке при попытке использовать класс, импортируя его. Ошибка: titleparser_1.default is not a function отображается при попытке создать его экземпляр после импорта библиотеки:

import TitleParser from './TitleParser'; 
const parser = new TitleParser(); // the error occurs here 

исправить это, чтобы экспортировать класс ниже, как это:

class TitleParser {} 
export default TitleParser; 

выше будет производить правильный Код JavaScript, то есть

class TitleParser {} 
exports.default = TitleParser; 

Впоследствии использование класса больше не выдает ошибки.

Моя конфигурация компилятор следующее:

"module": "commonjs", 
    "target": "es6", 
    "noImplicitAny": true, 
    "outDir": "../api", 
    "rootDir": "src", 
    "sourceMap": true, 
    "experimentalDecorators": true 

И компилятор версии: 1.7.5

Является ли это ошибка в компиляторе или я делаю что-то не так? Компилятор никогда не жалуется.

+1

Если вы установите цель ES5. Все будет хорошо. Поэтому, принимая во внимание то, что говорит здесь создатель языка: https://github.com/Microsoft/TypeScript/issues/2242#issuecomment-83694181. Я думаю, что это ошибка в компиляторе. – Amid

ответ

1

Вы не должны указывать на ES6 при использовании commonjs (компилятор обычно предупреждает вас об этом ... см. Следующий абзац по потенциальной причине, почему он не работает).

Если вы скопировали свой конфиг прямо из вашего файла, вы также недостающую запятую в конце строки:

"sourceMap": true 

Если цель ES5 и исправить конфиг (Visual Studio код велик при указании из вопросов), то выход будет:

var TitleParser = (function() { 
    function TitleParser() { 
    } 
    return TitleParser; 
})(); 
exports.default = TitleParser; 
//# sourceMappingURL=titleparser.js.map 

что вы можете использовать так же, как вы собираетесь:

import TitleParser from './titleparser' 

var x = new TitleParser(); 

Все испытания с v1.7.5

ES6

Если вы хотите использовать ES6, настроить свой код так:

export class TitleParser { 

} 

И:

import {TitleParser} from './titleparser' 

var x = new TitleParser(); 
+0

Это была опечатка при копировании файла tsconfig. Я добавил параметр experimentalDecorators вручную, отредактировав вопрос и забыв о запятой. Проблема в том, что мне нужно настроить таргетинг на es6, потому что я использую функции async/await и не работает с таргетингом на es5. Кроме того, я использую VSCode, и он никогда не жаловался на таргетинг на es6 и использование 'commonjs'. – eAbi

+0

Я добавил рекомендуемое изменение, если вы хотите использовать ES6 (он использует импорт стиля ES6 с простым экспортом (т. Е. Не по умолчанию). – Fenton

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