Typescript - รวมยูเนียนของทูเพิลพารามิเตอร์
ฉันมีการรวมของพารามิเตอร์:
type Params = [{ name: string }] | [{ x: number, y: number } | ...];
ฉันต้องการรวมทุกทูเพิลในยูเนียน (โดยไม่ขึ้นกับจำนวนทูเพิลในยูเนียน) และได้ผลลัพธ์ดังต่อไปนี้:
type ParamsJoined = [{ name: string, x: number, y: number, ... }];
ฉันไม่สามารถใช้เทคนิคอย่าง const ได้เนื่องจากประเภท Params ถูกสร้างขึ้นแบบไดนามิกโดยใช้ Parameters และประเภทเงื่อนไขแบบกระจายบนยูเนียนของฟังก์ชัน
ฉันจะทำมันได้อย่างไร?
คำตอบ #1
เอาล่ะ คุณต้องการ 3 สิ่งในการบรรลุ:
- ดึงประเภทพื้นฐานออกจากประเภทอาร์เรย์
- แยกประเภทยูเนียน
- และรวมประเภทที่แยกออกเป็นหนึ่ง
อันแรกเป็นอันง่ายซึ่งรวมถึงประเภทที่ทำแผนที่และคำหลัก infer:
type UnderlyingType<T> = T extends Array<infer R> ? R : T;
สำหรับข้อที่สอง คุณต้องอ้างอิงถึงคำถามนี้
และอันที่สามค่อนข้างก้าวหน้าเล็กน้อยและคุณควรอ้างอิงถึงคำถามนี้
และสุดท้าย คุณจะได้บางสิ่งบางอย่างแบบด้านล่าง:
type U1 = UnderlyingType<Params>
type SplitTyped = SplitType<U1>
type FinalType = Spread<SplitTyped[0],SplitTyped[1]>
ลิงก์สนามเด็กเล่น
แก้ไข: สำหรับจำนวนอาร์กิวเมนต์ประเภทที่ไม่ทราบ (ซึ่งมีข้อจำกัดจนถึงบางแห่ง) คุณสามารถใช้แผนที่ประเภท SpreadTuple เพื่อให้บรรลุได้
type SpreadTuple<T extends any[], L extends number = T['length']> = L extends 0 ? never
: L extends 1 ? T[0]
: L extends 2 ? Spread<T[0], T[1]>
: L extends 3 ? Spread<T[0], Spread<T[1], T[2]>>
: L extends 4 ? Spread<T[0], Spread<T[1],Spread<T[2],T[3]>>>
: never; // continiue to somewhere
และจากนั้นคุณสามารถใช้มันตามที่คุณต้องการ:
type FinalType = SpreadTuple<SplitTyped>
ลิงก์สนามเด็กเล่น
