ค้นหาเว็บไซต์

สรุปนิพจน์จากสตริงใน 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;