2016-01-05 8 views
6

Próbuję ponownie wyeksportować zmienną za pomocą składni modułu es6, a następnie ją zmienić i zobaczyć zmianę odzwierciedloną w ostatecznym imporcie. Ale nie działa zgodnie z oczekiwaniami. Patrz poniższy przykład:Ponowne eksportowanie zmiennego zmiennej e-mail w module 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" 
    } 
} 

Wynik biegu:

$ node out/c.js 
1 
1 

Spodziewam ostateczna console.log wydrukować 2, w celu odzwierciedlenia aktualizacji, ale tak nie jest. Jednak jeśli skompiluję ten sam przykład z Babel, to działa. Czy ponowne eksportowanie zmiennych wiązań zmiennych nie działa w ogóle z pismem maszynowym lub czy robię coś nie tak?

Odpowiedz

4

To dlatego b.ts:

export * from './a'; 

transpiles do

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

i wartość zmiennej a jest kopiowany i nie odwoływać.

Można pracować go wokół w ten sposób:

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

Czy to oznacza, że ​​maszynopis nie obsługuje w pełni składni modułu ES6? Dobrze jest mieć obejście, ale wolałbym nie dodawać zmiennych. Ale jeśli jest to jedyny sposób, w jaki zadziała, myślę, że nie mam wyboru. –

+0

Zgodnie z [this] (https://github.com/Microsoft/TypeScript/issues/1215#issuecomment-168963929) może działać, jeśli wygenerowany kod był specyficzny dla es5, co moim zdaniem może być, ponieważ ustawiłem cel = es5. –

Powiązane problemy