【问题标题】:Merge or operator in object Typescript对象打字稿中的合并或运算符
【发布时间】:2019-10-02 12:28:59
【问题描述】:

【问题讨论】:

  • 我发布了游乐场

标签: typescript


【解决方案1】:

处理联合类型的常用方法是使用类型保护将联合缩小到其中一个成员。在这种情况下,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
  }
}

Play

现在,如果您真的想直接访问 payload 上的所有成员,则必须有一些 | undefined 进入属性类型(因为属性可能是特定联合成员上的 undefined)。我们可以从 here 改编 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 
}

Play

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 2018-09-15
    • 2019-04-20
    • 2019-07-17
    • 2023-03-14
    相关资源
    最近更新 更多