我在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
和params
的类型.如果params
是通用对象,则使其成为可选对象。
const foo3: IRoute<'/foo', {id: number}> = {
route: '/foo',
params: {
id: 1
}
}
const foo4: IRoute<'/foo', {}> = {
route: '/foo'
}
这是我的代码。如果您致电IRoute
它按我预期工作。但是,当从映射到 keyof
in 调用IRoute
时,它会中断,并且params
对于所有路由都是可选的。
这是一个TS游乐场。
将您的条件从:
{} extends Params ?
自:
keyof Params extends never ?
请参阅 TypeScript Playground。