From 444d05d2e429922e90d9454765a4795840111639 Mon Sep 17 00:00:00 2001 From: 3846masa <3846masahiro+git@gmail.com> Date: Tue, 7 Jan 2025 16:56:03 +0900 Subject: [PATCH] fix: strict type definitions for RouteParams --- index.d.ts | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/index.d.ts b/index.d.ts index 05f3cf9..aa436ff 100644 --- a/index.d.ts +++ b/index.d.ts @@ -8,21 +8,26 @@ export function parse(route: RegExp): { pattern: RegExp; } +type KeyRecord = + T extends `${infer P}?` // :id? + ? { [K in P]?: string | undefined } + : T extends `${infer P}.${string}` // :id.ext + ? { [K in P]: string } + : { [K in T]: string }; + export type RouteParams = T extends `${infer Prev}/*/${infer Rest}` - ? RouteParams & { wild: string } & RouteParams - : T extends `${string}:${infer P}?/${infer Rest}` - ? { [K in P]?: string } & RouteParams - : T extends `${string}:${infer P}/${infer Rest}` - ? { [K in P]: string } & RouteParams - : T extends `${string}:${infer P}?` - ? { [K in P]?: string } - : T extends `${string}:${infer P}` - ? { [K in P]: string } - : T extends `${string}*` + ? RouteParams & { wild: string } & RouteParams<`/${Rest}`> + : T extends `:${infer Rest}` + ? RouteParams<`/:${Rest}`> + : T extends `${string}/:${infer P}/${infer Rest}` + ? KeyRecord

& RouteParams<`/${Rest}`> + : T extends `${string}/:${infer P}` + ? KeyRecord

+ : T extends `${string}/*` ? { "*": string } - : T extends `${string}*?` - ? { "*"?: string } + : T extends `${string}/*?` + ? { "*"?: string | undefined } : {}; export function inject(route: T, values: RouteParams): string;