我有对象常数Map到3页的标题上的动态路线。
const ROUTES = {
'1': 'Page 1',
'2': 'Page 2',
'3': 'Page 3',
} as const
我正在检查路由参数是否是这些键中的一个,
const page = params.page
if (!page || !(page in ROUTES))
return <Navigate to="/profile" replace />
page // <-- This is of type string instead of "1" | "2" | "3"
我读到过in
关键字可以用作typeguard,我认为我在这里使用它是正确的,但是即使在条件之后,page变量的类型也是string
而不是"1" | "2" | "3"
。
现在,我将它重新分配并强制转换为一个typedPage
常量,但我觉得这是不必要的,必须有一种只使用typeguard的方法。
抱歉,如果这是问这里之前,但我找不到正确的关键字找到这个。
1条答案
按热度按时间am46iovg1#
你的代码可以像预期的那样工作,因为这个typescript代码在一天结束的时候被转化为javascript。
因此,您正在检查
page in ROUTES
是否为,换句话说,如果page的值为"1"
且类型为string,则将其与ROUTES
原型对象进行比较,并且它确实作为字符串字段存在。您需要创建一个新的
ROUTE_KEYS
类型的ROUTE
对象键,并将页面强制转换为该类型。在此运行TSplay