奇怪的Typescript字符串枚举不能从字符串中解析

时间:2017-08-22 17:38:47

标签: string typescript enums type-conversion

我的项目中有一个枚举,如此

export enum RootPage {
  HOME = <any>'HomePage',
  LOGIN = <any>'LoginPage',
  TEST01 = <any>'Test01Page',
  LAUNCHPAD = <any>'LaunchpadPage',
  JOBS = <any>'JobsPage',
  MACHINES =<any>'MachinesPage',
  GVARS =<any>'GvarsPage',
  RESOURCES=<any>'ResourcesPage',
  CONFIGURATION=<any>'ConfigurationPage', 
  TABS=<any>'TabsPage'
};

现在理论上我应该能够做到:

constructor(
   private menuitemsService:MenuitemsService
) {}
let pageString = 'HomePage';
let rp:RootPage = RootPage[pageString];
let pi:PageInterface = this.menuitemsService.getPagebyRoot(rp)

MenuItemsService:

getPagebyRoot(rootPage:RootPage): PageInterface {
  ...
}

唯一的问题是,在其内部&#39; MenuItemService.getPagebyRoot()中,它将解释为rp为HOME,而不是HomePage。

所以我最终不得不在MenuItemService中使用一个很棒的switch语句创建一个utlility方法。

 getRootPageFromString(name:string):RootPage {
    switch (name) {
        case RootPage.HOME.toString():
            return RootPage.HOME;
        case RootPage.LOGIN.toString():
            return RootPage.LOGIN;
        case RootPage.TEST01.toString():
            return RootPage.TEST01;
        case RootPage.LAUNCHPAD.toString():
            return RootPage.LAUNCHPAD;
        case RootPage.JOBS.toString():
            return RootPage.JOBS;
        case RootPage.MACHINES.toString():
            return RootPage.MACHINES;
        case RootPage.GVARS.toString():
            return RootPage.GVARS;
        case RootPage.RESOURCES.toString():
            return RootPage.RESOURCES;
        case RootPage.CONFIGURATION.toString():
            return RootPage.CONFIGURATION;
        case RootPage.TABS.toString():
            return RootPage.TABS;
    }

然后在我的代码中替换这一行:

let rp:RootPage = this.menuItemService.getRootPageFromString(pageString);

必须采用更简单的方法。

但令我感到困惑的是我不得不求助于此。

还有其他人有类似的经历吗?

还是找到了一个更简单的解决方案?

更新:

发表我自己的答案。是因为我使用的是Typescript 2.3.4 而不是 2.4 +

2 个答案:

答案 0 :(得分:3)

当您在typescript中创建枚举时(在引擎盖下),您会得到一个如下所示的对象:

<强>打字稿:

enum RootPage {
  HOME = <any>'HomePage',
  LOGIN = <any>'LoginPage'
}

<强> JavaScript的:

RootPage = {
  "HOME": "HomePage",
  "LOGIN": "LoginPage",
  "LoginPage": "LOGIN",
  "HomePage: "HOME"
}

因此,当您从此枚举/对象访问属性时,您将获得值/键:

Console.log(RootPage["HOME"]);     // HomePAge
Console.log(RootPage["HomePage"]); // HOME

这一切都得出一个简单的结论:如果你有钥匙,你可以得到价值,如果你有价值,你可以得到钥匙。 无需长时间case 。看来你已经掌握了价值。

答案 1 :(得分:0)

发现它特定于我正在使用的Typescript版本。

版本2.3.4有问题。 2.4_ +似乎没问题。见here

我最后收到了消息:

输入&#39; string&#39;如果我使用以下代码,则不能分配给&#39; RootPage&#39;

let pageString = 'HomePage'; 
let rp:RootPage = RootPage[RootPage[pageString]];