我有一个RestApi,它以Json格式向我发送响应,该响应包含例如一个地址对象,该地址对象随后保存了address1,address2,city等。因此,我在我的应用程序中创建了一个接口,其中包含这些对象的定义,例如
export interface ISurveyResponseDetail {
docID?: string;
permission?: string;
property?: IProperty;
surveyID?: string;
}
export interface IProperty {
address1?: string;
address2?: string;
city?: string;
state?: string;
zip?: string;
然后在我的ts文件中,我想使用数据适配器将我的响应映射到此接口。但是我不确定如何将属性类型为IProperty的Object分配给值
static adaptSurveyResponseDetail(data): ISurveyResponseDetail {
if (data) {
return {
property:
// address1 _.get(data, 'property.address1', null),
// city _.get(data, 'property.city', null),
docID: _.get(data, 'docID', null),
permission: _.get(data, 'permission', null),
surveyID: _.get(data, 'survey_id', null),
};
} else {
return data;
}
}
答案 0 :(得分:1)
尝试类似的方法
static adaptSurveyResponseDetail(data): ISurveyResponseDetail {
if (data) {
return {
property: {
address1: data.address1,
address2: data.address2,
city: data.city,
state: data.state,
zip: data.zip,
},
docID: data.docID,
permission: data.permission,
surveyID: data['survey_id'],
};
} else {
return data;
}
}
答案 1 :(得分:1)
我有一个RestApi,它以Json格式向我发送响应
我认为也许您正在使这一过程变得比它所需要的更为复杂? HttpClient具有通用方法,可让您将已解析的json响应强制转换为接口。
getSurveyResponse() : Observable<ISurveyResponseDetail> {
return httpClient.get<ISurveyResponseDetail>('/end/point/here');
}
答案 2 :(得分:1)
不要将界面的所有属性设为可选。您可以将额外的类型定义为部分类型,并且仅在需要灵活性的情况下使用。
export interface ISurveyResponseDetail {
property: IProperty;
docID: string;
permission: string;
property: IProperty;
surveyID: string;
}
export type ISurveyResponseDetailPartial = Partial<ISurveyResponseDetail>;
export interface IProperty {
address1: string;
address2: string;
city: string;
state: string;
zip: string;
}
export type IPropertyPartial = Partial<IProperty >;
请勿使用下划线将默认值设置为null
。而是定义一个默认对象。
const DEFAULT_SURVEY_RESPONSE_DETAIL: ISurveyResponseDetail = {
property: DEFAULT_PROPERTY,
docID: null,
permission: null,
property: null,
surveyID: null
}
const DEFAULT_PROPERTY: IProperty{
address1: null,
address2: null,
city: null,
state: null,
zip: null
}
您不需要适配器来重建对象,因为HTTP客户端可以为您反序列化JSON为一种类型。如果要将 missing 属性设置为null
,请使用默认对象作为第一个参数构造一个新对象,然后应用这些值。任何缺少的属性都将保留为null
。
getSurveyResponseDetail() : Observable<ISurveyResponseDetail> {
return this.http.get<ISurveyResponseDetail>(...).pipe(
map(data => {
const property = {...DEFAULT_PROPERTY, ...(data.property || {})};
return {...DEFAULT_SURVEY_RESPONSE_DETAIL, ...data, property};
});
}