导入到对象内部

Rem*_*.co 2 typescript ecmascript-6

我是 TypeScript 的新手,正在尝试将当前的 JavaScript 转换为 TypeScript。

在 JS 中我有这样的结构:

var roles = {
    x: require('role.x'),
    y: require('role.y')
};
Run Code Online (Sandbox Code Playgroud)

目的是稍后迭代这些角色,如下所示:

for (var index in roles) {
  var role = new roles[index];
  if (someObject.role == role.role) {
    role.run(someObject);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

let roles = {
  x: import X from "./roles/x"
}
Run Code Online (Sandbox Code Playgroud)

哪个产量

Error:(11, 14) TS1109: Expression expected.
Error:(11, 21) TS1005: ':' expected.
Error:(11, 31) TS1005: ',' expected.
Error:(11, 36) TS1005: ':' expected.
Run Code Online (Sandbox Code Playgroud)

那么,TypeScript 相当于实现相同的方法或者更干净/TypeScript 方式的替代方法吗?

Ame*_*kar 5

为了完整起见,现在(自 2017 年以来),另一种方法是使用动态导入语句。

V8 规格提供了更多相关信息。

import()声明返回一个承诺。

所以,理论上,这应该可行(并且看起来更类似于 JSrequire代码):


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

Run Code Online (Sandbox Code Playgroud)

如果您想从导入的文件中分配特定的函数/实体,您应该能够这样做:


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

如果有人喜欢使用相反的.then()方式(为了并发),那么这个StackOverflow 答案显示了将 await 替换为.then()将返回的 Promise 分配给对象键。

我希望这有帮助。