【问题标题】:Angular 4 typescript parsing enum interface attribute in response objectAngular 4 typescript解析响应对象中的枚举接口属性
【发布时间】:2017-08-07 03:32:07
【问题描述】:

我收到来自 API 的响应,它返回一个枚举值。从 API 返回的值在请求中表示为字符串。 该值是 typescript 接口的 enum 属性。

问题: 收到响应时,TS 接口将该值存储为字符串(可能就是问题所在),因此我不能直接将其用作enum

对象模型:

export interface Condo {

  id:number
  title:string
  latitude:number
  longitude:number

  city:string
  country:string
  district:string
  address:string
  locationType: LocationType
}

export enum LocationType {
  CONDO,
  MALL,
  STATION
}

请求:

getCondoAllByCountry(country_code){
    return this.http.get(this.config.apiEndpoint +this.subApiUrl+'/all')
      .map(res => <Condo[]>res.json())
      .catch((err:Response) => {
        return Observable.throw(err.json());
      });
    }

使用示例:

    this.condoService.getCondoAllByCountry(this.userData.country_code).subscribe(data=>{
          someFunc(data)
        })

............
    someFunc(condo_list: Condo[]){
    //here is need to know the `locationType` for each object
      console.log(typeof condo_list[i].locationType);
      console.log(typeof LocationType.CONDO)
      switch (condo_list[i].locationType){
        case LocationType.CONDO:
          console.log('Case - condo')
          break;
        case LocationType.MALL:
          console.log('Case - mall')
          break;
        case LocationType.STATION:
          console.log('Case - station')
          break;
      }
    }

因此,switch.. case 不适用于此属性。在console.log() 我得到:

console.log(typeof condo_list[i].locationType); - string

console.log(typeof LocationType.CONDO) - number

那么,这意味着存在解析问题并且condo_list[i].locationType 不是enum(考虑到它应该为枚举显示number)?

我应该如何解决它?

【问题讨论】:

    标签: angular typescript ionic2


    【解决方案1】:

    如果您使用的是 typescript 2.4 或更高版本,则可以如下声明字符串枚举:

    export enum LocationType {
      CONDO = 'CONDO',
      MALL = 'MALL',
      STATION = 'STATION'
    }
    
    // ...
    
    switch (object.locationType) {
        case LocationType.CONDO: // ...
        case LocationType.MALL: // ...
        case LocationType.STATION: // ...
    }
    

    在旧版本中,您只能使用基于数字的枚举。在这种情况下,您最好使用字符串文字联合类型:

    export type LocationType = 'CONDO' | 'MALL' | 'STATION';
    
    // ...
    
    switch (object.locationType) {
        case 'CONDO': // ...
        case 'MALL': // ...
        case 'STATION': // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多