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

时间:2019-02-04 21:52:03

标签: javascript typescript types optional 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 }
}

我需要输入RouterouteName的{​​{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

1 个答案:

答案 0 :(得分:0)

从以下位置更改您的状况:

{} extends Params ?

收件人:

keyof Params extends never ?

请参见TypeScript Playground