انتخاب عنصر از یونین تایپاسکریپت بر اساس مقدار آن


من اتحادیهای به این شکل دارم:

type Message = 
  | { type: 'first', someParam: any } // let it be AMsg
  | { type: 'second', someAnotherParam: any, andOneAnother: any }

میخواهم یکی از عناصر این اتحاد را به صورت یک نوع جداگانه مانند این به دست بیاورم:

type AMsg = MessageOfType<'first'> // = { type: 'first', someParam: any }

من تلاش کردهام پیام نوع خودم را بنویسم:

type MessageOfType<T extends Message['type']> = Message['type'] extends T ? Message : never

اما همیشه هرگز برمیگرداند.

برای گرفتن یک عنصر یا چند عنصر با type که با مقدار مورد نیاز از اتحاد مطابقت دارد، باید از چه چیزی استفاده کنم؟

پاسخ شماره ۱

شما میتوانید برای این کار از نوع شرطی از پیش تعریفشده Extract استفاده کنید:

type Message = 
  | { type: 'first', someParam: any } // let it be AMsg
  | { type: 'second', someAnotherParam: any, andOneAnother: any }

type AMsg = Extract<Message, { type: 'first' }>

پیوند زمین بازی

پاسخ شماره ۲

به جای انجام حرکات آکروباتیک نوع، ممکن است بخواهید بازسازی کنید:

 type Message = AMsg | BMsg
 type AMsg = { type: 'first', someParam: any }
 type BMsg = { type: 'second', someAnotherParam: any, andOneAnother: any }

لینک زمین بازی