При создании интерфейса, для которого требуется установить одно из двух возможных свойств, полезно объединение типов:
enum Plans { bronze, silver, gold }
type Plan = keyof typeof Plans;
interface CreateSubscriptionBase {
/** User's id */
uid: string;
/** Plan id */
planName: Plan;
}
interface CreateSubscriptionPaymentMethod extends CreateSubscriptionBase {
/** Payment Method id */
paymentMethod: string;
}
interface CreateSubscriptionSource extends CreateSubscriptionBase {
/** Source id */
source: string;
}
export type CreateSubscriptionParams =
CreateSubscriptionPaymentMethod
| CreateSubscriptionSource
const sParams = {
uid: 'foo',
planName: 'bronze',
source: 'source',
} as CreateSubscriptionParams
const pParams = {
uid: 'foo',
planName: 'bronze',
paymentMethod: 'paymentMethod',
} as CreateSubscriptionParams
Однако при использовании этого интерфейса для деструкции параметров функции все происходит внезапно go screwy:
function createSubscription({ uid, planName, paymentMethod, source }: CreateSubscriptionParams) {
return 'hi'
}
example.ts:36:46 - error TS2339: Property 'paymentMethod' does not exist on type 'CreateSubscriptionParams'.
36 { uid, planName, paymentMethod, source }: CreateSubscriptionParams,
~~~~~~~~~~~~~
example.ts:36:61 - error TS2339: Property 'source' does not exist on type 'CreateSubscriptionParams'.
36 { uid, planName, paymentMethod, source }: CreateSubscriptionParams,
~~~~~~
Как мы можем это осуществить?