2016-07-29 54 views
1

我是新來的TypeScript,並且試圖將我當前的JavaScript轉換爲TypeScript。在對象中導入

在JS我有這樣的結構:

var roles = { 
    x: require('role.x'), 
    y: require('role.y') 
}; 

隨着後來遍歷這些角色像這樣的目的:

for (var index in roles) { 
    var role = new roles[index]; 
    if (someObject.role == role.role) { 
    role.run(someObject); 
    } 
} 

在打字稿但是,似乎我無法做到這樣的:

let roles = { 
    x: import X from "./roles/x" 
} 

其中產量

Error:(11, 14) TS1109: Expression expected. 
Error:(11, 21) TS1005: ':' expected. 
Error:(11, 31) TS1005: ',' expected. 
Error:(11, 36) TS1005: ':' expected. 

那麼TypeScript的等價物是如何實現相同的-或者的另一種更清晰的/ TypeScript方法?

回答

1

這不是關於TypeScript,而是關於ES6。進口是靜態的,它們不能動態使用:

import * as x from "./roles/x"; 
import * as y from "./roles/y"; 
let roles = { 
    x: x, 
    y: y 
}; 

請參閱a good introduction to ES6 modules here。在「靜態與動態」部分:

對於一種動態語言,JavaScript已經成爲一個令人驚訝的靜態模塊系統。

  • importexport所有的味道只在一個模塊中的頂層允許的。沒有條件導入或導出,並且不能在函數範圍中使用導入。

  • 所有導出的標識符必須在源代碼中按名稱顯式導出。您無法以編程方式遍歷數組,並以數據驅動的方式導出一堆名稱。

+0

雖然這兩個答案都是正確的,但我會接受這個ES6模塊入門和權威的'',你不能在函數範圍內使用導入。「謝謝! –

+0

沒問題,再加上他首先回答:) – AlexG

2

ES6進口必須在你的模塊的頂層找到,否則這是一個語法錯誤。

import * as x from "./roles/x"; 
import * as y from "./roles/y"; 

let roles = {x, y};