type ExtractRouteParamsKey = T extends `${infer P1}:${infer P2}/${infer P3}` ? P2 | ExtractRouteParamsKey : T extends `${infer P1}:${infer P2}` ? P2 : T extends `:${infer P2}/${infer P3}` ? P2 | ExtractRouteParamsKey : T extends `:${infer P2}` ? P2 : never type ExtractRouteParams = { [key in ExtractRouteParamsKey]: string } export const fillRoutePath = (path: T, params: ExtractRouteParams) => { let processPath: string = path for (const [key, value] of Object.entries(params)) { const rg = new RegExp(`:${key}/?`) processPath = processPath.replace(rg, value as string) } return processPath } const place = /(?:\/:([^/]*))/g export const verifiRoutePath = (pathname: string, path: string) => { const rg = path .replace(/\/([^:])/g, (_, d) => `\\/${d}`) .replace(place, () => `(?:/[^/]*)`) return new RegExp(`^${rg}$`).test(pathname) }