2016-01-05 97 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,但事實並非如此。但是,如果我編譯與巴貝爾相同的例子它的作品。重新導出可變變量綁定不能與打字機一起工作,還是我只是做錯了什麼?

回答

4

這是因爲b.ts

export * from './a'; 

transpiles到

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

和可變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

這是否意味着打字稿不完全支持ES6模塊語法?有一個解決方法是很好的,但我寧願不必爲變量添加前綴。但如果這是唯一的方式,我想我沒有選擇。 –

+0

根據[this](https://github.com/Microsoft/TypeScript/issues/1215#issuecomment-168963929)它可以工作,如果生成的代碼是es5特定的,我認爲這可能是因爲我已經設置目標= ES5。 –