使用“in”关键字的Typescript typeguard,未按预期对对象工作

1wnzp6jl  于 2023-02-10  发布在  TypeScript
关注(0)|答案(1)|浏览(125)

我有对象常数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的方法。
抱歉,如果这是问这里之前,但我找不到正确的关键字找到这个。

am46iovg

am46iovg1#

你的代码可以像预期的那样工作,因为这个typescript代码在一天结束的时候被转化为javascript。
因此,您正在检查page in ROUTES是否为,换句话说,如果page的值为"1"且类型为string,则将其与ROUTES原型对象进行比较,并且它确实作为字符串字段存在。
您需要创建一个新的ROUTE_KEYS类型的ROUTE对象键,并将页面强制转换为该类型。
在此运行TSplay

相关问题