type ParamValue = string | number | boolean; type ReadFrom = Path extends `${string}[${infer Rest}` ? ReadUntil : []; type ReadUntil = Path extends `${infer Match}]${infer Rest}` ? [Match, ...ReadFrom] : []; type RemovePrefixes = Key extends `[...${infer Name}` ? Name : Key extends `...${infer Name}` ? Name : Key; type StrictParams = Pathname extends `${string}[${string}` ? { [Key in ReadFrom[number] as RemovePrefixes]: Key extends `[...${string}` ? Array | undefined : Key extends `...${string}` ? Array : ParamValue; } : never; export default StrictParams;