У меня проблема с отображением в 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
, это работает, как я ожидаю.Но когда IRoute
вызывается из сопоставления через keyof
, он прерывается и params
является необязательным для всех маршрутов.
Вот игровая площадка TS .