1- type StripOptional < T > = T extends `${infer U } ?` ? U : T ;
1+ type ResolveOptionalPathParam < T extends string > =
2+ T extends `${infer PathParam } ?`
3+ ? {
4+ [ key in PathParam ] ?: string | undefined ;
5+ }
6+ : {
7+ [ key in T ] : string ;
8+ } ;
29
310/**
411 * @params T - The URL e.g. /posts/:id
@@ -8,21 +15,19 @@ type RecursivelyExtractPathParams<
815 T extends string ,
916 TAcc extends null | Record < string , string > ,
1017> = T extends `/:${infer PathParam } /${infer Right } `
11- ? {
12- [ key in StripOptional < PathParam > ] : string ;
13- } & RecursivelyExtractPathParams < Right , TAcc >
18+ ? ResolveOptionalPathParam < PathParam > &
19+ RecursivelyExtractPathParams < Right , TAcc >
1420 : T extends `/:${infer PathParam } `
15- ? { [ key in StripOptional < PathParam > ] : string }
21+ ? ResolveOptionalPathParam < PathParam >
1622 : T extends `/${string } /${infer Right } `
1723 ? RecursivelyExtractPathParams < Right , TAcc >
1824 : T extends `/${string } `
1925 ? TAcc
2026 : T extends `:${infer PathParam } /${infer Right } `
21- ? {
22- [ key in StripOptional < PathParam > ] : string ;
23- } & RecursivelyExtractPathParams < Right , TAcc >
27+ ? ResolveOptionalPathParam < PathParam > &
28+ RecursivelyExtractPathParams < Right , TAcc >
2429 : T extends `:${infer PathParam } `
25- ? TAcc & { [ key in StripOptional < PathParam > ] : string }
30+ ? TAcc & ResolveOptionalPathParam < PathParam >
2631 : T extends `${string } /${infer Right } `
2732 ? RecursivelyExtractPathParams < Right , TAcc >
2833 : TAcc ;
0 commit comments