2016-01-05 16 views
6

Sto tentando di riesportare una variabile utilizzando la sintassi del modulo es6, quindi cambiarla e vedere la modifica riflessa nell'importazione finale. Ma non funziona come previsto. Vedere l'esempio di seguito:Dattiloscritto moduli es6 riesportare la variabile mutabile vincolante

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" 
    } 
} 

Risultato di periodo:

$ node out/c.js 
1 
1 

mi aspetto il console.log finale per stampare 2 al fine di riflettere l'aggiornamento, ma non è così. Tuttavia, se compilo lo stesso esempio con Babel funziona. La riesportazione dei bind delle variabili mutabili non funziona affatto con dattiloscritto o sto semplicemente facendo qualcosa di sbagliato?

risposta

4

È perché b.ts:

export * from './a'; 

transpiles a

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

e il valore della variabile a viene copiato e non si fa riferimento.

È possibile lavorare in giro in questo modo:

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

Ciò significa che dattiloscritto non supporta completamente la sintassi del modulo ES6? È bello avere un work-around, ma preferirei non dover prefisso le variabili. Ma se è l'unico modo in cui funziona, suppongo di non avere altra scelta. –

+0

Secondo [questo] (https://github.com/Microsoft/TypeScript/issues/1215#issuecomment-168963929) potrebbe funzionare se il codice generato fosse es5 specifico, il che penso potrebbe essere dato che ho impostato il target = ES5. –

Problemi correlati