Atualmente, isso só pode analisar algo como /user/:id/update/:id2
e sempre será uma string.
type Data = "/user/:id/update/:id2" // -> { id: string, id2: string }
type Parse<T extends string, Memo extends string[] = []> =
T extends `${infer Part}/${infer Others}`
? Part extends `:${infer Value}` ? Parse<Others, [...Memo, Value]> : Parse<Others, Memo>
: T extends `:${infer Value}` ? [...Memo, Value] : Memo;
type TupleToObject<T extends string[]> = {
[Key in T[number]]: string
}
// { id: string, id2: string }
type Result = TupleToObject<Parse<Data>>
É possível analisar algum dia como "/user/:id(string)/update/:id2(number)/:id3"
? O padrão é string se não for especificado. Isto será:
{
id: string;
id2: number;
id3: string;
}
Também é possível tornar o código mais simples.