[英]Merge or operator in object Typescript
如何擺脫或運算符( |
)並合並所有 object 屬性以供所有人訪問?
因為現在,輸入payload.signInMethod
TS 抱怨這個方法不存在於任何“或組”中,而是這個。 如何編寫類型以合並所有 object 鍵?
處理聯合類型的常用方法是使用類型保護將聯合縮小到其中一個成員。 在這種情況下, in
類型保護效果最好:
type Context = {
EventApplication: {
applicationPhase: string;
};
SignInRef: {
signInMethod: 'google' | 'facebook' | 'yahoo' | 'username';
};
ExpressCheckout: {
paymentMethodPresent: boolean;
shippingAddressPresent: boolean;
receivePartnerEmails: boolean;
promoCode: string;
}
}
const getContext = (payload: Context[keyof Context]) => {
if('signInMethod' in payload) {
payload.signInMethod;
} else if('applicationPhase' in payload) {
payload.applicationPhase
} else{
payload.promoCode
}
}
現在,如果您真的想直接在payload
上訪問所有成員,一些| undefined
| undefined
必然會滲透到屬性類型中(因為屬性可能在特定的聯合成員上undefined
)。 我們可以從這里調整StrictUnion
以使類型以您想要的方式工作:
type UnionKeys<T> = T extends any ? keyof T : never;
type StrictUnionHelper<T, TAll> = T extends any ? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, undefined>> : never;
type StrictUnion<T> = StrictUnionHelper<T, T>
type Context = {
EventApplication: {
applicationPhase: string;
};
SignInRef: {
signInMethod: 'google' | 'facebook' | 'yahoo' | 'username';
};
ExpressCheckout: {
paymentMethodPresent: boolean;
shippingAddressPresent: boolean;
receivePartnerEmails: boolean;
promoCode: string;
}
}
const getContext = (payload: StrictUnion<Context[keyof Context]>) => {
payload.applicationPhase // string | undefined
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.