【问题标题】:Make generic object optional when mapping over object keys (in keyof)映射对象键时使通用对象可选(在 keyof 中)
【发布时间】:2019-06-28 16:59:13
【问题描述】:

我在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,它会按我的预期工作。但是当IRoutekeyof 的映射中被调用时,它会中断并且params 对于所有路由都是可选的。

这是TS playground

【问题讨论】:

    标签: javascript typescript types optional keyof


    【解决方案1】:

    从以下位置更改您的条件:

    {} extends Params ?
    

    到:

    keyof Params extends never ?
    

    请参阅TypeScript Playground

    【讨论】:

    • 我同意这个解决方案的工作,但我不确定为什么{} extends Params ? 没有。这似乎在映射类型之外起作用,但在它内部不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多