Сделать универсальный объект необязательным при отображении ключей объекта (в keyof) - PullRequest
0 голосов
/ 05 февраля 2019

У меня проблема с отображением в 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 .

1 Ответ

0 голосов
/ 05 февраля 2019

Измените ваше состояние с:

{} extends Params ?

на:

keyof Params extends never ?

См. TypeScript Playground .

...