我试图通过字符串从模块动态实例化一个类。
说我有./src/main.ts
,./src/role/index.ts
和./src/role/role<n>.ts
./src/role/index.ts
内:
export * from './role1.ts'
export * from './role2.ts'
示例角色./src/role/role1.ts
export class Role1 {
constructor() { }
}
然后从我的主人那里,我想做一些像
这样的事情import * as Roles from './role'
function load_role(to_load: string) {
for(let role in Roles) {
if(role == to_load) // e.g. Role1
return Roles[role]()
}
}
为了避免尴尬的事情,例如:
import * as Roles from './role'
function load_role(to_load: string) {
if(to_load == 'Role1')
return Roles.Role1()
else if(to_load == 'Role<n>')
return Roles.Role<n>()
}
但是我不能用字符串引用Roles模块,这可能吗?
答案 0 :(得分:1)
您可以做的最接近的事情是键入to_load
作为string literals的联合:
function load_role(to_load: "Role1" | "Role2") {
for(let role in Roles) {
if (role == to_load) // e.g. Role1
return Roles[to_load]();
}
}
或者,如果您可以丢失静态类型,则将其转换为any
:
function load_role(to_load: string) {
if ((Roles as any)[to_load]) {
(Roles as any)[to_load]();
}
}
答案 1 :(得分:0)
但是我不能用字符串引用Roles模块,这可能吗?
没有。 ES6模块专为静态安全而设计,不允许在模块中使用 string 索引器。