Я бы использовал генерики для этого:
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
, что, возможно, не то, что вы хотите, но не запрещено.Приведенного выше определения, вероятно, достаточно для большинства случаев использования.
Надеюсь, это поможет.Удачи!