2016-01-05 19 views
6

es6モジュール構文を使用して変数を再エクスポートしようとしていますが、変更して最終的なインポートに反映されています。しかし、期待どおりに動作していません。以下の例を参照してください:Typescript es6モジュールが可変変数バインディングを再エクスポートする

a.ts

export var a = 1; 
export function changeA() { a = 2; } 

b.ts

export * from './a'; 

c.tsを

import { a, changeA } from './b'; 
console.log(a); // 1 
changeA(); 
console.log(a); // Expected 2 but get 1 

tsconfig.json

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "commonjs", 
    "outDir": "out" 
    } 
} 
ランの

結果:

$ node out/c.js 
1 
1 

私は最終的にconsole.logが更新を反映させるために2を印刷することを期待したが、それはしていません。しかし、同じサンプルをbabelでコンパイルしても動作します。変更可能な変数バインディングを再エクスポートすることは、typescriptをまったく使用できないのですか?何か間違っていますか?

答えて

4

b.tsからである。

function __export(m) { 
    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 
} 
__export(require('./a')); 

export * from './a'; 

transpiles可変aの値がコピーされ、参照されていません。

あなたがこの方法のまわりでそれを働かせることができる:

a.ts

export var a = 1; 
export var deeper = { 
    a: 1 
}; 
export function changeA() { 
    a = 2; 
    deeper.a = 2; 
} 

b.ts

export * from './a'; 

c.ts

import { a, deeper, changeA } from './b'; 
console.log(a); // 1 
changeA(); 
console.log(a); // Expected 2 but get 1 
console.log(deeper.a); // prints 2 as expected 
+1

これは、typescriptがES6モジュール構文を完全にサポートしていないことを意味しますか?回避策があるのは良いことですが、変数に接頭辞を付ける必要はありません。しかし、それがうまくいく唯一の方法なら、私は選択肢がないと思う。 –

+0

[this](https://github.com/Microsoft/TypeScript/issues/1215#issuecomment-168963929)によれば、生成されたコードが特定のes5であれば動作する可能性があります。これは、ターゲットを設定してから= es5。 –

関連する問題