我在映射中遇到问题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用routeNameand输入params。如果params是通用对象,则使其成为可选对象。
const foo3: IRoute<'/foo', {id: number}> = {
route: '/foo',
params: {
id: 1
}
}
const foo4: IRoute<'/foo', {}> = {
route: '/foo'
}
这是我的代码。如果您称它为IRoute我所期望的那样工作。但是当IRoute从映射中调用时,keyof它会中断并且params对于所有路由都是可选的。
这是一个TS游乐场。