جاوااسکریپت - تایپاسکریپت اینترفیس، ارجاع به یک خاصیت نمونه برای خاصیت دوم پویا


من میخواهم از یک ویژگی در نمونهای از یک رابط Typescript برای محاسبه ویژگی دوم استفاده کنم. من در حال بررسی Generics بودهام اما هنوز آن را بهدرستی پیادهسازی نکردهام.

در اینجا یک نمونه است

// Here I define all valid names - works fine!

type ModalNames = 'payment' | 'source'

// This interface implements all expected payloads
//  for each name 

interface ModalPayloads {
  payment: {
    plan: string
  }
  source: {
    metadataId: string
  }
}


// How do I use the instance name
//  to grab the correct payload property?
export interface ShowModalPayload {
  name: ModalNames
  modalProps?: ModalPayloads[instance.name]
}

به عبارت دیگر، برای یک instance مشخص از ShowModalPayload، من میخواهم modalProps را به نوعی که از instance.name مشتق شده است اختصاص دهم. امیدوارم این منطقی باشد!

پاسخ شماره ۱

من برای این از جنریکها استفاده میکنم:

export interface ShowModalPayload<K extends ModalNames> {
  name: K
  modalProps?: ModalPayloads[K]
}

استفاده از ModalPayloads[K] را به جای ModalPayloads[instance.name] توجه کنید. این نوع «نوع جستجو» نامیده میشود و به شما اجازه میدهد نوع m[k] را توصیف کنید، جایی که m نوع ModalPayloads دارد و k نوع K دارد.

به هر حال، رابط ShowModalPayload اکنون در K عمومی است، که باید یکی از مقادیر ModalNames باشد:

declare const smpPayment: ShowModalPayload<'payment'>;
smpPayment.name // "payment"
smpPayment.modalProps // {plan: string} | undefined

declare const smpSource: ShowModalPayload<'source'>;
smpSource.name // "source"
smpSource.modalProps // {metadataId: string} | undefined

من فکر میکنم اینها با چیزی که دنبال آن هستید مطابقت دارند. توجه داشته باشید که موارد زیر هنوز امکانپذیر است:

declare const smpWhoKnows: ShowModalPayload<ModalNames>
smpWhoKnows.name // ModalNames
smpWhoKnows.modalProps // {plan: string} | {metadataId: string} | undefined

که شاید چیزی نباشد که شما بخواهید، اما ممنوع نیست. تعریفی که در بالا آمده احتمالاً برای اکثر موارد استفاده کافی است.

امیدوارم کمک کند. موفق باشید!