2016-01-05 23 views
6

Es6 modülü sözdizimini kullanarak bir değişkeni yeniden dışa aktarmaya çalışıyorum, sonra değiştirin ve son içe aktarmada yansıyan değişikliği görün. Ama beklendiği gibi çalışmıyor. Aşağıdaki örneğe bakın:Typescript es6 modülleri değiştirilebilen değişken bağlayıcısını yeniden dışa aktarma

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" 
    } 
} 
çalışmasının

Sonuç:

$ node out/c.js 
1 
1 

Final console.log güncellemesini yansıtmak için 2 yazdırmak için bekliyoruz ama öyle değil. Ancak, aynı örneği babel ile derlersek çalışır. Değişken değişken bağları yeniden dışa aktarma, yazı tipiyle çalışmaz mı yoksa sadece yanlış bir şey mi yapıyorum?

cevap

4

b.ts çünkü öyle: başvurulan

export * from './a'; 

transpiles

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

ve değişken a değeri kopyalanır ve.

Bu yolla etrafında çalışabilirsiniz:

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

Bu, yazı tipinin ES6 modülünün sözdizimini tam olarak desteklemediği anlamına mı geliyor? Çalışmak için iyi bir şey ama ben değişkenleri öneki yapmak zorunda kalmamayı tercih ederim. Ama işe yarayacak tek yol buysa sanırım başka seçeneğim yok. –

+0

[this] 'e göre (https://github.com/Microsoft/TypeScript/issues/1215#issuecomment-168963929) oluşturulan kod es5'e özgüyse çalışabilir, çünkü hedef belirlediğimden olabilir = ES5. –

İlgili konular