从枚举构建数组

时间:2019-01-07 16:31:28

标签: typescript

我一直在努力理解导致问题的代码。如果有人可以解释导致问题的原因以及解决方法,那就太好了。

在我的应用中,我试图使用一个枚举来定义路由器使用的路由。这在某些地方有效,但是由于某些原因,在我现在使用枚举的情况下,它无法正常工作。

在可行的地方,可能看起来像这样:

history.push(routes.testPage)

在无效的地方,看起来像这样:

const enum routes {
    index = '/',
    testPage = '/test',
}

const adminRoutes = [
    routes.testPage,
];

const routeIsAdmin = (route: string) => adminRoutes.indexOf(route) > -1;

我在这种情况下遇到的错误是:

  

“字符串”类型的参数不能分配给“路线”类型的参数

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

有人可以对此提供任何见识吗?


修改

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

1 个答案:

答案 0 :(得分:1)

您不能通过枚举构建数组。认为枚举定义是在翻译过程中丢失的东西。它仅在该过程中用于检查。它们仍然会在生成的代码中以字符串形式出现,但只有在按值引用时才会出现。

在您的特定情况下,您可以执行route as string即可将其转换为字符串...

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

...但是这很难闻,因为您现在依赖于直接链接到实际路径的路线。

出于所有意图和目的,您应该将枚举大部分视为事物的不同实例,而没有附加任何重要价值。当然,它在内部确实具有价值,但是最好忽略它。我的看法是,如果将基础string值替换为number值而您的枚举不起作用,那么这是错误的方法。

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

const routes = {
    index: '/',
    testPage: '/test',
};

const adminRoutes = [
    routes.testPage,
];

const routeIsAdmin = (route: string) => adminRoutes.indexOf(route) > -1;

然后您仍然可以做类似Object.keys(routes)之类的事情。