Συμπεράνετε έκφραση από μια συμβολοσειρά σε Typescript
Δεδομένου του παρακάτω κώδικα, όλα φαίνεται να είναι εντάξει (δες το πεδίο δοκιμών):
type PathParam<T> = T extends `${string}:${infer U}` ? U : never;
type Param = PathParam<"/post/:post_id">;
// type Param = "post_id"
Αλλά γίνεται λίγο πιο περίπλοκο όταν υπάρχει επιπλέον κείμενο μετά την παράμετρο διαδρομής.
type PathParam<T> = T extends `${string}:${infer U}` ? U : never;
type Param = PathParam<"/post/:post_id/likes/:like_id">;
// type Param = "post_id/likes/:like_id"
Μπορώ να καταλάβω γιατί αποτυγχάνει, αλλά δεν είμαι σίγουρος πώς μπορώ να υποθέσω μόνο το μοτίβο :$ {string} στο TypeScript. Στα regex θα ήταν ισοδύναμο με /:[a-z_]+/g
Η ερώτησή μου είναι - πώς μπορώ να κάνω το Param να συμπεραστεί ως ο ακόλουθος τύπος;
type Param = "post_id" | "like_id"
Απάντηση #1
Χρειάζεστε αναδρομικό τύπο για να εκτελέσετε κάποιο βρόχο ώστε να κατασκευάσετε ένωση δυναμικού μεγέθους.
δοκίμασε :
type PathParam<T extends string, Res extends string = never> =
T extends `${string}:${infer U}/${infer Rest}`
? U | PathParam<Rest, Res> :
T extends `${string}:${infer L}`
? L : Res;
