参考模块按字符串

时间:2017-05-22 05:37:21

标签: typescript

我试图通过字符串从模块动态实例化一个类。

说我有./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模块,这可能吗?

2 个答案:

答案 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 索引器。