我有两个接口。一个来自后端:
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;
答案 0 :(得分:0)
TypeScript是结构化类型,因此如果类型具有所有相同的成员,您可以直接分配它们:
let info: IPrescriptionInfo;
let prescription: IPrescription = info;
在您的情况下,您面临两个问题。第一个是IPrescriptionInfo
是比IPrescription
更弱的类型(IPrescriptionInfo
的所有成员都是可选的,因此它可能是一个完全空的对象)。第二个是您需要进行类型转换(例如从number
到Moment
)。
这意味着您不是简单地映射成员(如果您是,您可以使用此答案顶部的代码),您主动需要处理源对象中的未定义成员,并且您需要转换值太
prescription.prescriprionDate = (info.prescriprionDate)
? new Moment(info.prescriprionDate)
: new Moment(0);
如果您可以使源对象比可能为空的对象更健壮,则可以减少或删除编写代码以映射数据的需要。