我在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
的{{1}}类型。如果params
是通用对象,则使其为可选。
params
这是我的代码。如果您致电const foo3: IRoute<'/foo', {id: number}> = {
route: '/foo',
params: {
id: 1
}
}
const foo4: IRoute<'/foo', {}> = {
route: '/foo'
}
,它会按我的预期工作。但是,当从IRoute
的映射中调用IRoute
时,它将中断,并且keyof
对于所有路由都是可选的。
这里是TS playground。
答案 0 :(得分:0)