在对象键(在 keyof 中)映射时,使通用对象可选



我在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带有routeNameparams的类型.如果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。

最新更新