Closed8

TanStack Router の path の型を取りたい

nbstshnbstsh

Tanstack Router の Link to で利用されてる path の型を取りたい。

nbstshnbstsh

型がだいぶ複雑だが巡っていく。

ToPathOption ってやつだな。

export type ToSubOptions<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> | string = string, TTo extends string = ''> = {
    to?: ToPathOption<TRouteTree, TFrom, TTo>;
    hash?: true | Updater<string>;
    state?: true | NonNullableUpdater<HistoryState>;
    from?: RoutePathsAutoComplete<TRouteTree, TFrom>;
} & CheckPath<TRouteTree, {}, TFrom, TTo> & SearchParamOptions<TRouteTree, TFrom, TTo> & PathParamOptions<TRouteTree, TFrom, TTo>;

nbstshnbstsh

ToPathOption

export type ToPathOption<TRouteTree extends AnyRoute = AnyRoute, TFrom extends RoutePaths<TRouteTree> | string = string, TTo extends string = ''> = TTo | RelativeToPathAutoComplete<TRouteTree, NoInfer<TFrom> extends string ? NoInfer<TFrom> : '', NoInfer<TTo> & string>;
nbstshnbstsh
RelativeToPathAutoComplete<TRouteTree, NoInfer<TFrom> extends string ? NoInfer<TFrom> : '', NoInfer<TTo> & string>;

次は、RelativeToPathAutoComplete をみる

nbstshnbstsh

RelativeToPathAutoComplete

export type RelativeToPathAutoComplete<TRouteTree extends AnyRoute, TFrom extends string, TTo extends string, TPaths = RoutePaths<TRouteTree>> = TTo extends `..${string}` ? RelativeToParentPathAutoComplete<TFrom, RemoveTrailingSlashes<TTo>, TPaths> : TTo extends `./${infer TRestTTo}` ? RelativeToCurrentPathAutoComplete<TFrom, RemoveTrailingSlashes<TTo>, TRestTTo, TPaths> : AbsolutePathAutoComplete<TFrom, TPaths>;

prettier かける

export type RelativeToPathAutoComplete<
  TRouteTree extends AnyRoute,
  TFrom extends string,
  TTo extends string,
  TPaths = RoutePaths<TRouteTree>,
> = TTo extends `..${string}`
  ? RelativeToParentPathAutoComplete<TFrom, RemoveTrailingSlashes<TTo>, TPaths>
  : TTo extends `./${infer TRestTTo}`
    ? RelativeToCurrentPathAutoComplete<
        TFrom,
        RemoveTrailingSlashes<TTo>,
        TRestTTo,
        TPaths
      >
    : AbsolutePathAutoComplete<TFrom, TPaths>;

RoutePaths<TRouteTree> ってのが気になるな

nbstshnbstsh

RoutePaths<TRouteTree>

export type RoutePaths<TRouteTree extends AnyRoute> = ParseRoute<TRouteTree>['fullPath'] | '/';

RouteTree の型をとってきて、RoutePaths に渡してあげればいけそう

nbstshnbstsh

RouteTree の型を取りたい

export interface Register {
}
export type AnyRouter = Router<AnyRoute, any>;
export type RegisteredRouter = Register extends {
    router: infer TRouter extends AnyRouter;
} ? TRouter : AnyRouter;

RegisteredRouter に Register interface に渡した typeof router が入るわけか。

declare module '@tanstack/react-router' {
  interface Register {
    router: typeof router;
  }
}

てことは、RegisteredRouter['routeTree'] で RouteTree の型取れる。

import { RegisteredRouter } from "@tanstack/react-router";

type RouteTreeType = RegisteredRouter['routeTree'];
nbstshnbstsh

結論

RegisteredRouterRoutePaths の組み合わせで取れる。

こんな感じ↓

import { RegisteredRouter, RoutePaths } from "@tanstack/react-router";

type Path = RoutePaths<RegisteredRouter['routeTree']>;

このスクラップは2024/03/05にクローズされました