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

Typescript - รวมยูเนียนของทูเพิลพารามิเตอร์


ฉันมีการรวมของพารามิเตอร์:

type Params = [{ name: string }] | [{ x: number, y: number } | ...];

ฉันต้องการรวมทุกทูเพิลในยูเนียน (โดยไม่ขึ้นกับจำนวนทูเพิลในยูเนียน) และได้ผลลัพธ์ดังต่อไปนี้:

type ParamsJoined = [{ name: string, x: number, y: number, ... }];

ฉันไม่สามารถใช้เทคนิคอย่าง const ได้เนื่องจากประเภท Params ถูกสร้างขึ้นแบบไดนามิกโดยใช้ Parameters และประเภทเงื่อนไขแบบกระจายบนยูเนียนของฟังก์ชัน

ฉันจะทำมันได้อย่างไร?

คำตอบ #1

เอาล่ะ คุณต้องการ 3 สิ่งในการบรรลุ:

  1. ดึงประเภทพื้นฐานออกจากประเภทอาร์เรย์
  2. แยกประเภทยูเนียน
  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>

ลิงก์สนามเด็กเล่น