我是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方式的替代方法?
答案 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已经成为一个令人惊讶的静态模块系统。
只允许在模块中使用
import
和export
的所有类型。没有条件导入或导出,也不能在函数范围内使用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>
我希望这会有所帮助。