export type FlattenUnion = unknown extends T ? never : { [K in keyof T]: T[K]; }; export type ExtractRouteParams = T extends `${string}{${infer Param}}${infer Rest}` ? FlattenUnion & ExtractRouteParams> : unknown; type GetParamOptional = T extends `${infer Param}?:${infer ParamType}` ? { [K in Param]: MakeOptional, true>; } : T extends `${infer Param}?${infer ArrayBrackets}` ? GetParamWithoutTypeInfo<`${Param}${ArrayBrackets}`, true> : never; type GetParamRequired = T extends `${infer Param}:${infer ParamType}` ? { [K in Param]: TypeConverter; } : T extends `${infer Param}` ? GetParamWithoutTypeInfo : never; type GetParamWithoutTypeInfo = T extends `${infer Param}[]` ? { [K in Param]: MakeOptional; } : { [K in T]: MakeOptional; }; type MakeOptional = Optional extends true ? T | undefined : T; export type GetParam = T extends `${string}?${string}` ? GetParamOptional : GetParamRequired; type TypeConverterElemental = T extends 'number' ? number : T extends 'boolean' ? boolean : T extends 'string' ? string : any; export type TypeConverter = T extends `${infer Type}[]` ? TypeConverterElemental[] : TypeConverterElemental; export {};