สรุปนิพจน์จากสตริงใน Typescript
จากโค้ดด้านล่าง ทุกอย่างดูเรียบร้อยดี (ดูที่ playground):
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;
