Cum să generezi corect ținta ES6 cu module CommonJS în Typescript 1.7?


În TypeScript 1.7 a fost adăugată o caracteristică care permite să se țintească separat sistemul de limbaj și sistemul de module, de exemplu poate produce cod ES6 cu sistem de module CommonJS pentru cel mai recent Node. Dar dacă încerc cu următoarea comandă și cod sursă:

tsc *.ts --target es6 --module commonjs
// foo.ts
"use strict";
import Bar from './bar';
console.log(Bar);
// bar.ts
"use strict";
export default class Bar {}

Surprinzător, codul rezultat are o notație de export foarte ciudată generată:

// foo.js
"use strict";
var bar_1 = require('./bar');
console.log(bar_1.default);
// bar.js
"use strict";
class Bar {}
exports.Bar = Bar;

După cum puteți vedea, bar.js exportă obiectul Bar, în timp ce foo.js încearcă să importe obiectul default. Și, desigur, acest cod afișează „undefined” fiind importat dacă este executat cu ultima versiune nodejs v4.1.0

Vreo idee de ce un asemenea comportament ciudat?

Răspuns #1

Ai găsit un bug în TS 1.7. Cred că aceasta este problema corectă:

  • https://github.com/Microsoft/TypeScript/issues/5594
  • și corecția corespunzătoare a bug-ului https://github.com/Microsoft/TypeScript/pull/5648 care a fost fuzionată în ramura master TS 1.8.

Am verificat-o rulând codul în TS@next (Versiunea 1.8.0-dev.20151216):

npm install typescript@next --save
node node_modules/typescript/bin/tsc --target es6 --module commonjs *.ts && node foo.js