如何将一个类似的对象无缝转换为另一个类似的对象,既符合打字稿中类似的接口?

时间:2017-11-15 17:16:22

标签: oop typescript interface

我有两个接口。一个来自后端:

interface IPrescriptionInfo {
    budget?: BenefitBudget;
    discount?: string;
    prescriprionDate?: number;
    prescriptionAPU?: string;
    prescriptionAmount?: number;
    prescriptionMedicine?: string;
    prescriptionMethod?: string;
    prescriptionMode?: PrescriptionMode;
    prescriptionNumber?: string;
    prescriptionRecordID?: string;
    prescriptionRole?: string;
    prescriptionSpeciality?: string;
    prescriptionState?: PrescriptionStatus;
    prescriptionType?: string;
    prescriptionUserUID?: string;
    protocolID?: string;
    recipeEhrID?: string;
}

和另一个内部数据模型:

interface IPrescription {
  budget?: string;
  discount: number;
  precriptionControl?: string;
  prescriprionDate: Moment;
  prescriptionAmount: number;
  prescriptionAPU: string;
  prescriptionMedicine: string;
  prescriptionMethod: string;
  prescriptionMode?: string;
  prescriptionNumber: string;
  prescriptionRecordID: string;
  prescriptionRole: string;
  prescriptionSpeciality: string;
  prescriptionState?: string;
  prescriptionType: string;
  prescriptionUserUID: string;
  protocolID: string;
  recipeEhrID: string;
} 

如何使用Typescript功能无缝地将符合IPrescriptionInfo的对象转换为IPrescription而无需“手动”逐个分配属性?


更新
只是为了清楚。想寻找避免初级代码的方法,如:

const prescription: IPrescription;
const prescriptionInfo: IPrescriptionInfo;
...
prescription.discount = prescriptionInfo.discount;
prescription.prescriprionDate = prescriptionInfo.prescriprionDate;
prescription.prescriptionAPU = prescriptionInfo.prescriptionAPU;
prescription.prescriptionAmount = prescriptionInfo.prescriptionAmount;
...
prescription.recipeEhrID = prescriptionInfo.recipeEhrID;

1 个答案:

答案 0 :(得分:0)

TypeScript是结构化类型,因此如果类型具有所有相同的成员,您可以直接分配它们:

let info: IPrescriptionInfo;

let prescription: IPrescription = info;

在您的情况下,您面临两个问题。第一个是IPrescriptionInfo是比IPrescription更弱的类型(IPrescriptionInfo的所有成员都是可选的,因此它可能是一个完全空的对象)。第二个是您需要进行类型转换(例如从numberMoment)。

这意味着您不是简单地映射成员(如果您是,您可以使用此答案顶部的代码),您主动需要处理源对象中的未定义成员,并且您需要转换值太

prescription.prescriprionDate = (info.prescriprionDate)
    ? new Moment(info.prescriprionDate)
    : new Moment(0);

如果您可以使源对象比可能为空的对象更健壮,则可以减少或删除编写代码以映射数据的需要。