1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

feat: Improve typing of NavigateToRoute

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-05-03 10:42:26 -04:00
parent cd62e9a2e8
commit d1a659bf74

View File

@ -3,26 +3,39 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectionToken } from "@ogre-tools/injectable";
import type { RequiredKeysOf } from "type-fest";
import type { HasRequiredKeys } from "type-fest";
import type { Route } from "./front-end-route-injection-token";
export type NavigateWithParameterOptions<TParameters> = (
TParameters extends object
? RequiredKeysOf<TParameters> extends never
? { parameters?: TParameters }
: { parameters: TParameters }
export type NavigateWithParameterOptions<TParameters extends object> = (
HasRequiredKeys<TParameters> extends true
? { parameters: TParameters }
: { parameters?: TParameters }
);
export type NavigateWithParameterOptionsForRoute<TRoute> = (
TRoute extends Route<infer Params extends object>
? NavigateWithParameterOptions<Params>
: { parameters?: undefined }
);
export interface BaseNavigateToRouteOptions {
query?: Record<string, string>;
fragment?: string;
withoutAffectingBackButton?: boolean;
parameters?: undefined;
}
export type NavigateToRouteOptions<TRoute> = (
TRoute extends Route<void>
? ([] | [options: BaseNavigateToRouteOptions])
: TRoute extends Route<infer Params extends object>
? HasRequiredKeys<Params> extends true
? [options: BaseNavigateToRouteOptions & { parameters: Params }]
: ([] | [options: BaseNavigateToRouteOptions & { parameters?: Params }])
: ([] | [options: BaseNavigateToRouteOptions])
);
export interface NavigateToRoute {
(route: Route<void>, options?: BaseNavigateToRouteOptions): void;
<R extends Route<Params>, Params>(route: R, options: BaseNavigateToRouteOptions & NavigateWithParameterOptions<Params>): void;
<Route>(route: Route, ...options: NavigateToRouteOptions<Route>): void;
}
export const navigateToRouteInjectionToken = getInjectionToken<NavigateToRoute>(