将响应数据强制转换为包含地图的类

时间:2018-05-03 10:36:58

标签: typescript

我以这种形式从后端收到一些json数据。字段'labels'应该是字符串映射(后端处理它的方式):

收到json数据:

  

0:Object {labels:Object {group1:“developers”} name:“test1”}   1:Object {labels:Object {group2:“testers”} name:“test2”}

在我的打字稿代码中,我有一个名为Group的类。当我收到此回复时,我尝试使用

将其转换为Group类
this.groups = <Group[]>data

我的问题是标签应该作为Map处理而不是作为对象处理,这实际上从未使用该行处理,因此我无法设置新的键和值。这是实现这一目标的最佳方式?这是我的代码:

服务

@Injectable()
export class ProjectsService {

  constructor(private http: Http) { }


  getGroups() {

    let headers = new Headers();
    headers.append('Content-type', 'application/json');
    headers.append('Accept', 'application/json');
    return this.http.get('http://localhost:8080' + '/groups' , { headers:headers })
      .map(res => res.json());
  }
}

组件

ngOnInit() {

  this.groupsService.getGroups().subscribe(data => {

       this.groups = <Group[]>data
      console.log("Groups",this.groups)
    }
      , err => { console.log(err) })

  }

export class Group {
    name:string;
    users?:string[];
    labels?:Map<string, string>
}

1 个答案:

答案 0 :(得分:1)

Map是JavaScript类。 JSON没有这种类型,这就是labels显示为Object的原因。所以你有两个选择:

  • 自己从对象Map
  • 构建labels
  • labels的类型更改为{ [label: string]: string },并将其用作Object

构建地图可能如下所示:

this.groups = (<any[]>data).map(group => {
   let labelsObject = group.labels;
   group.labels = new Map<string, string>();

   if (labelsObject) {
     Object.keys(labelsObject).forEach(key => group.labels.set(key, labelsObject[key]));
   }

   return <Group>group;
});