我可以在Typescript中的数组上放置一个“对象”接口吗?

时间:2015-06-12 12:16:46

标签: typescript

为了在地图上显示一条线,我从REST服务获得了许多带坐标的数据:

{
  "name": "line1"
  "route": [["2015-03-26T23:29:57",-0.9,-81.8],["2015-03-26T23:34:58",-0.9,-81.8],["2015-03-26T23:39:59",-0.8,-81.8],...]
}

由于JSON中有很多数据,我使用的是一个数组(带有Timestamp,Latitude,Longitude),而不是一个对象,因为那时我的响应大小会增加一倍(因为重复了属性名称)。 / p>

我有一个界面:

export interface ILine {
    name: string
    route: IWaypoint[]
}

现在我想致电:

public handleResponse(line: ILine) {
    for (var i in line.route) {
        var waypoint = line.route[i];
        var timestamp: string = waypoint.timestamp;
        var lat: number = waypoint.latitude;
        var lon: number = waypoint.longitude;
    }
}

但这可能吗?我该如何实现IWaypoint接口?

这适用于类型安全,但我仍然无法使用属性名称:

  export interface IWaypoint extends Array<Date | number> {
    0: Date
    1: number
    2: number
  }

我仍然需要记住纬度位于第1位。

对索引使用'常量'(var或enum)时,Typescript无法确定类型。

const wpLatitude = 1;
var lat: number = waypoint[wpLatitude]; // <- error: Argument of type 'number | Date' is not assignable to parameter of type 'number'

enum WaypointIndex {
  TIMESTAMP,
  LATITUDE,
  LONGITUDE
}

var lat: number = waypoint[WaypointIndex.LATITUDE]; // <- error

1 个答案:

答案 0 :(得分:1)

TypeScript在大多数情况下都不会尝试modify ouput JS,因此如果您想访问数组上的命名字段,最好将其转换为对象:

var route = line.route.map((wp) =>
{
    return { timestamp: wp[0], latitude: wp[1], longitude: wp[2] };
});