我一直在努力理解导致问题的代码。如果有人可以解释导致问题的原因以及解决方法,那就太好了。
在我的应用中,我试图使用一个枚举来定义路由器使用的路由。这在某些地方有效,但是由于某些原因,在我现在使用枚举的情况下,它无法正常工作。
在可行的地方,可能看起来像这样:
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
意味着这没有问题。这并不是我真正想使用的解决方法,但也许可以帮助解释问题。
答案 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)
之类的事情。