代码之家  ›  专栏  ›  技术社区  ›  OliverRadini

从枚举生成数组

  •  0
  • OliverRadini  · 技术社区  · 6 年前

    我一直在努力理解这个代码是什么导致了一个问题。如果有人能解释是什么导致了这个问题,也许还能解释如何解决这个问题,那就太好了。

    在我的应用程序中,我尝试使用枚举来定义路由器使用的路由。这在某些地方有效,但出于某种原因,在我现在使用枚举的上下文中,它不起作用。

    在它工作的地方,可能看起来像这样:

    history.push(routes.testPage)
    

    在不起作用的地方,它看起来像这样:

    const enum routes {
        index = '/',
        testPage = '/test',
    }
    
    const adminRoutes = [
        routes.testPage,
    ];
    
    const routeIsAdmin = (route: string) => adminRoutes.indexOf(route) > -1;
    

    我在这个实例中得到的错误是:

    “string”类型的参数不能分配给“routes”类型的参数

    I've created an example of this code on the typescript playground.

    有人能提供这方面的任何见解吗?


    编辑

    为了进一步清晰起见,请将任何字符串添加到数组中 adminRoutes 这意味着这没有问题。这并不是我真正想使用的解决方法,但也许它有助于解释这个问题。

    1 回复  |  直到 6 年前
        1
  •  1
  •   zeh    6 年前

    不能从枚举生成数组。把枚举定义看作是蒸腾过程中丢失的东西。它只存在于检查过程中。它们仍然作为字符串出现在生成的代码中,但只有在被值引用时才会出现。

    在你的具体案例中,你 能够 只做一个 route as string 要将它们转换为字符串…

    const routeIsAdmin = (route: routes) => {
        adminRoutes.indexOf(route as string) > -1;
    }
    

    …但那是一种很难闻的气味,因为你现在依赖于直接链接到实际路径的路线。

    对于所有的意图和目的,您应该将枚举主要看作是 事情 没有重大价值。当然,它在内部确实有一个值,但最好忽略它。在我看来,如果你的Enums不能正常工作 string 值被替换为 number 价值观,那就是错误的方法。

    我诚实的意见?从语义上讲,您根本不需要枚举,而是需要实际字符串的列表。

    const routes = {
        index: '/',
        testPage: '/test',
    };
    
    const adminRoutes = [
        routes.testPage,
    ];
    
    const routeIsAdmin = (route: string) => adminRoutes.indexOf(route) > -1;
    

    然后你仍然可以做像 Object.keys(routes) 等。