【问题标题】:Weird Typescript string enum not resolving from a string奇怪的 Typescript 字符串枚举无法从字符串中解析
【发布时间】:2017-08-22 17:38:46
【问题描述】:

我的项目中有一个这样定义的枚举

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)

菜单项服务:

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

唯一的问题是,在 'MenuItemService.getPagebyRoot() 中,它会将 rp 解释为 HOME,而不是 HomePage。

所以我最终不得不在 MenuItemService 中创建一个实用方法,并带有一个很棒的 switch 语句。

 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+

【问题讨论】:

    标签: string typescript enums type-conversion


    【解决方案1】:

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

    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
    

    这一切都得出一个简单的结论:如果你有key,你就能得到value,如果你有value,你就能得到key。 无需为此写很长的case。看来您已经掌握了价值。

    【讨论】:

    【解决方案2】:

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

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

    我会得到消息:

    如果我使用以下代码,则不能将类型“字符串”分配给类型“RootPage”:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多