我在映射中遇到问题keyof
。我正在尝试映射Routes
类型,但是当我映射对象时,它会破坏Route
.
type Routes = {
'/home': {}
'/pages': {
pageId: number
}
}
type IRoute<RouteName, Params> = {
route: RouteName
} & ({} extends Params ? { params?: Params } : { params: Params })
type Router = {
[RouteName in keyof Routes]: IRoute<RouteName, Routes[RouteName]>
}
type Route = Router[keyof Router]
这里params
应该是必需的,但 TS 忽略它:
const foo: Route = {
route: '/pages'
// Missing params: { pageId: number }
}
我需要Route
用routeName
and输入params
。如果params
是通用对象,则使其成为可选对象。
const foo3: IRoute<'/foo', {id: number}> = {
route: '/foo',
params: {
id: 1
}
}
const foo4: IRoute<'/foo', {}> = {
route: '/foo'
}
这是我的代码。如果您称它为IRoute
我所期望的那样工作。但是当IRoute
从映射中调用时,keyof
它会中断并且params
对于所有路由都是可选的。
这是一个TS游乐场。