如何在Angular中为对象分配值

时间:2019-09-17 17:27:27

标签: angular typescript

我有一个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;
        }

    }

3 个答案:

答案 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};
     });
}