جاوااسکریپت - تایپاسکریپت اینترفیس، ارجاع به یک خاصیت نمونه برای خاصیت دوم پویا
من میخواهم از یک ویژگی در نمونهای از یک رابط 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
که شاید چیزی نباشد که شما بخواهید، اما ممنوع نیست. تعریفی که در بالا آمده احتمالاً برای اکثر موارد استفاده کافی است.
امیدوارم کمک کند. موفق باشید!
