diff --git a/packages/react-router/src/link.tsx b/packages/react-router/src/link.tsx index d0bbbdd8199..3023a10288c 100644 --- a/packages/react-router/src/link.tsx +++ b/packages/react-router/src/link.tsx @@ -465,20 +465,25 @@ export type LinkComponent< props: LinkComponentProps, ) => React.ReactElement -export type LinkComponentRoute = < - TRouter extends AnyRouter = RegisteredRouter, - const TTo extends string | undefined = undefined, - const TMaskTo extends string = '', ->( - props: LinkComponentProps< - 'a', - TRouter, - TDefaultFrom, - TTo, - TDefaultFrom, - TMaskTo - >, -) => React.ReactElement +export interface LinkComponentRoute< + in out TDefaultFrom extends string = string, +> { + defaultFrom: TDefaultFrom + < + TRouter extends AnyRouter = RegisteredRouter, + const TTo extends string | undefined = undefined, + const TMaskTo extends string = '', + >( + props: LinkComponentProps< + 'a', + TRouter, + this['defaultFrom'], + TTo, + this['defaultFrom'], + TMaskTo + >, + ): React.ReactElement +} export function createLink( Comp: Constrain ReactNode>, diff --git a/packages/react-router/src/route.tsx b/packages/react-router/src/route.tsx index 928116dba03..8ec238a5b3c 100644 --- a/packages/react-router/src/route.tsx +++ b/packages/react-router/src/route.tsx @@ -53,8 +53,8 @@ declare module '@tanstack/router-core' { } export interface RouteExtensions< - TId extends string, - TFullPath extends string, + in out TId extends string, + in out TFullPath extends string, > { useMatch: UseMatchRoute useRouteContext: UseRouteContextRoute diff --git a/packages/router-core/src/link.ts b/packages/router-core/src/link.ts index 5fa5a2a5b3d..26d038e769f 100644 --- a/packages/router-core/src/link.ts +++ b/packages/router-core/src/link.ts @@ -23,9 +23,7 @@ import type { MakeDifferenceOptional, NoInfer, NonNullableUpdater, - PickRequired, Updater, - WithoutEmpty, } from './utils' import type { ParsedLocation } from './location' @@ -469,11 +467,11 @@ type MakeRequiredParamsReducer< > = | (string extends TFrom ? never - : ResolveFromParams extends WithoutEmpty< - PickRequired< - ResolveRelativeToParams - > - > + : ResolveFromParams< + TRouter, + TParamVariant, + TFrom + > extends ResolveRelativeToParams ? true : never) | (ParamsReducer & {}) diff --git a/packages/router-core/src/redirect.ts b/packages/router-core/src/redirect.ts index e54e3f054b1..24de9024b2b 100644 --- a/packages/router-core/src/redirect.ts +++ b/packages/router-core/src/redirect.ts @@ -1,5 +1,4 @@ import type { NavigateOptions } from './link' -import type { RoutePaths } from './routeInfo' import type { AnyRouter, RegisteredRouter } from './router' import type { PickAsRequired } from './utils' @@ -10,9 +9,9 @@ export type AnyRedirect = Redirect */ export type Redirect< TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = '/', - TTo extends string | undefined = '.', - TMaskFrom extends RoutePaths | string = TFrom, + TFrom extends string = string, + TTo extends string | undefined = undefined, + TMaskFrom extends string = TFrom, TMaskTo extends string = '.', > = { href?: string @@ -39,9 +38,9 @@ export type Redirect< export type ResolvedRedirect< TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths = '/', + TFrom extends string = string, TTo extends string = '', - TMaskFrom extends RoutePaths = TFrom, + TMaskFrom extends string = TFrom, TMaskTo extends string = '', > = PickAsRequired< Redirect, diff --git a/packages/router-core/src/route.ts b/packages/router-core/src/route.ts index 4be19d5c24b..63443577906 100644 --- a/packages/router-core/src/route.ts +++ b/packages/router-core/src/route.ts @@ -442,7 +442,10 @@ export type ResolveFullPath< TPrefixed = RoutePrefix, > = TPrefixed extends RootRouteId ? '/' : TPrefixed -export interface RouteExtensions {} +export interface RouteExtensions { + id: TId + fullPath: TFullPath +} export type RouteLazyFn = ( lazyFn: () => Promise, @@ -564,9 +567,7 @@ export interface Route< in out TChildren, in out TFileRouteTypes, > extends RouteExtensions { - fullPath: TFullPath path: TPath - id: TId parentRoute: TParentRoute children?: TChildren types: RouteTypes< diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts index f41b47fe2f9..3a510d65068 100644 --- a/packages/router-core/src/router.ts +++ b/packages/router-core/src/router.ts @@ -94,15 +94,15 @@ export type ControllablePromise = Promise & { export type InjectedHtmlEntry = Promise -export interface Register { - // router: Router +export interface DefaultRegister { + router: AnyRouter } -export type RegisteredRouter = Register extends { - router: infer TRouter extends AnyRouter +export interface Register extends DefaultRegister { + // router: Router } - ? TRouter - : AnyRouter + +export type RegisteredRouter = Register['router'] export type DefaultRemountDepsFn = ( opts: MakeRemountDepsOptionsUnion, diff --git a/packages/router-core/src/utils.ts b/packages/router-core/src/utils.ts index 1418c2997c2..1df674e8b9c 100644 --- a/packages/router-core/src/utils.ts +++ b/packages/router-core/src/utils.ts @@ -37,12 +37,12 @@ export type DeepPartial = T extends object } : T -export type MakeDifferenceOptional = Omit< - TRight, - keyof TLeft -> & { - [K in keyof TLeft & keyof TRight]?: TRight[K] -} +export type MakeDifferenceOptional = keyof TLeft & + keyof TRight extends never + ? TRight + : Omit & { + [K in keyof TLeft & keyof TRight]?: TRight[K] + } // from https://stackoverflow.com/a/53955431 // eslint-disable-next-line @typescript-eslint/naming-convention diff --git a/packages/solid-router/src/link.tsx b/packages/solid-router/src/link.tsx index c4f406d915a..ca43fd2fa35 100644 --- a/packages/solid-router/src/link.tsx +++ b/packages/solid-router/src/link.tsx @@ -522,20 +522,25 @@ export type LinkComponent< props: LinkComponentProps, ) => Solid.JSX.Element -export type LinkComponentRoute = < - TRouter extends AnyRouter = RegisteredRouter, - const TTo extends string | undefined = undefined, - const TMaskTo extends string = '', ->( - props: LinkComponentProps< - 'a', - TRouter, - TDefaultFrom, - TTo, - TDefaultFrom, - TMaskTo - >, -) => Solid.JSX.Element +export interface LinkComponentRoute< + in out TDefaultFrom extends string = string, +> { + defaultFrom: TDefaultFrom + < + TRouter extends AnyRouter = RegisteredRouter, + const TTo extends string | undefined = undefined, + const TMaskTo extends string = '', + >( + props: LinkComponentProps< + 'a', + TRouter, + this['defaultFrom'], + TTo, + this['defaultFrom'], + TMaskTo + >, + ): Solid.JSX.Element +} export function createLink( Comp: Constrain Solid.JSX.Element>, diff --git a/packages/solid-router/src/route.tsx b/packages/solid-router/src/route.tsx index c14f0615872..a1c2762f690 100644 --- a/packages/solid-router/src/route.tsx +++ b/packages/solid-router/src/route.tsx @@ -53,8 +53,8 @@ declare module '@tanstack/router-core' { } export interface RouteExtensions< - TId extends string, - TFullPath extends string, + in out TId extends string, + in out TFullPath extends string, > { useMatch: UseMatchRoute useRouteContext: UseRouteContextRoute @@ -132,13 +132,13 @@ export class RouteApi< return notFound({ routeId: this.id as string, ...opts }) } - Link: LinkComponentRoute['fullPath']> = ( + Link: LinkComponentRoute['fullPath']> = (( props, ) => { const router = useRouter() const fullPath = router.routesById[this.id as string].fullPath return - } + }) as LinkComponentRoute['fullPath']> } export class Route< @@ -242,9 +242,9 @@ export class Route< return useNavigate({ from: this.fullPath }) } - Link: LinkComponentRoute = (props) => { + Link: LinkComponentRoute = ((props) => { return - } + }) as LinkComponentRoute } export function createRoute< @@ -427,9 +427,9 @@ export class RootRoute< return useNavigate({ from: this.fullPath }) } - Link: LinkComponentRoute<'/'> = (props) => { + Link: LinkComponentRoute<'/'> = ((props) => { return - } + }) as LinkComponentRoute<'/'> } export function createRouteMask<