export type RoutePath = string; export type RouteParams = Path extends `${infer _Start}:${infer Param}/${infer Rest}` ? { [key in Param | keyof RouteParams]: string; } : Path extends `${infer _Start}:${infer Param}` ? { [key in Param]: string; } : {}; export type RouteListener = (route: Path, path: string, routeParams: RouteParams) => Promise; export interface RouterInterface { init(): void; addRouteChangeListener(route: Path, listener: RouteListener): void; setRoute(route: string): void; navigate(route: string, shallow: boolean): void; getRoute(): string; getBasePath(): string; matchRoute(route: string, path: string): boolean; }