2

我在映射中遇到问题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 }
}

我需要RouterouteNameand输入params。如果params是通用对象,则使其成为可选对象。

const foo3: IRoute<'/foo', {id: number}> = {
    route: '/foo',
    params: {
        id: 1
    }
}

const foo4: IRoute<'/foo', {}> = {
    route: '/foo'
}

这是我的代码。如果您称它为IRoute我所期望的那样工作。但是当IRoute从映射中调用时,keyof它会中断并且params对于所有路由都是可选的。

这是一个TS游乐场

4

1 回答 1

0

改变你的条件:

{} extends Params ?

至:

keyof Params extends never ?

请参阅TypeScript Playground

于 2019-02-04T23:35:11.780 回答