导入对象内部

时间:2016-07-29 12:31:58

标签: typescript ecmascript-6

我是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);
  }
}

然而,在TypeScript中,我似乎无法做到这一点:

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方式的替代方法?

3 个答案:

答案 0 :(得分:2)

必须在模块的顶层找到ES6导入,否则会出现语法错误。

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

let roles = {x, y};

答案 1 :(得分:1)

这不是TypeScript而是ES6。导入是静态的,不能动态使用:

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

compressed oops。在“静态与动态”部分中:

  

对于动态语言,JavaScript已经成为一个令人惊讶的静态模块系统。

     
      
  • 只允许在模块中使用importexport的所有类型。没有条件导入或导出,也不能在函数范围内使用import。

  •   
  • 必须在源代码中按名称显式导出所有导出的标识符。您不能以编程方式循环遍历数组并以数据驱动的方式导出一堆名称。

  •   

答案 2 :(得分:0)

出于完整性考虑,现在(自2017年以来),另一种实现方法是使用动态import语句。

V8 Specs对此提供了更多信息。

import()语句返回一个诺言。

因此,从理论上讲,这应该可以工作(并且看起来更类似于JS require代码):


let roles = {
    x: await import('./roles/x'),
    y: await import('./roles/y')
};

如果您想从导入的文件中分配特定的功能/实体,则应该可以这样做:


let roles = {
    x: await (async () => {let {X} = await import('./roles/x'); return X;})()
    y: await (async () => {let {Y} = await import('./roles/x'); return Y;})()
};

如果某个人更喜欢使用.then()(为了并发),那么this StackOverflow答案显示将.then()替换为await,以将返回的诺言分配给对象密钥。 / p>

我希望这会有所帮助。