由于奇怪的类型接口,未解决的推送方法

时间:2013-03-21 14:52:14

标签: javascript json typescript geojson

我创建了一个这样的模块:

module GeoJSON {    
    export interface position {
        (): number[];
    }

    export interface coordinateArray {
        () : position[];
    }

    export interface polygonRings {
        (): position[][];
    }

    export class GeometryType {
        public static Point: string = "Point";
        public static LineString: string = "LineString";
        public static Polygon: string = "Polygon";
        public static MultiPoint: string = "MultiPoint";
        public static MultiLineString: string = "MultiLineString";
        public static MultiPolygon: string = "MultiPolygon";
        public static MultiGeometry: string = "MultiGeometry";
    }

    export interface Geometry {
        type?: string;
    }

    export interface Point extends Geometry {
        coordinates: position;
    }

    export interface LineString extends Geometry {
        coordinates: coordinateArray;
    }

    export interface Polygon extends Geometry {
        coordinates: polygonRings;
    }

    export interface MultiPolygon extends Geometry {
        coordinates: polygonRings[];
    }

    export interface MultiPoint extends Geometry {
        coordinates: coordinateArray;
    }

    export interface MultiLineString extends Geometry {
        coordinates: polygonRings;
    }

    export interface GeometryCollection extends Geometry {
        geometries: Geometry[];
    }
}

当我使用它时,我得到一个愚蠢的错误。那push是一个未解决的方法......

var lineString: GeoJSON.LineString = <GeoJSON.LineString> this._myGeometry;
lineString.coordinates.push(position);

我尝试将坐标转换为GeoJSON.position[]。代码编译,但JavaScript抛出错误:(

(<GeoJSON.position[]> lineString.coordinates).push(position);

如何在此处显示push?我无法将coordinates的类型从coordinateArray更改为position[],因为稍后JSON.stringify将返回不同的JSON数据,服务器将无法回答。

2 个答案:

答案 0 :(得分:2)

Geistics仍然是TypeScript的open work item。因此,虽然您可以positioncoordinateArraypolygonRings扩展数组以了解推送方法的存在,但类型仍然永远不会匹配。 lib.d.ts中的数组使用hacky _element,它由编译器专门处理,直到实现泛型。

您可以将Array的定义复制到position并将_element的所有实例替换为数字,但这感觉真的很难看。我要么用{[1}}替换所有position实例,要么给位置x和y(和z)成员。

您的运行时问题几乎肯定是您从未正确构建LineString所以lineString.coordinates未定义。而不是转换为LineString使接口成为类并设置构造函数中的所有成员。即:

export interface position {
    x: number;
    y: number;
}

export class LineString implements Geometry {
    coordinates: position[];
    constructor() {
        this.coordinates = [];
    }
}

var lineString: GeoJSON.LineString = new GeoJSON.LineString();
lineString.coordinates.push({ x: 0, y: 0 });

答案 1 :(得分:1)

要清楚,当你这样写:

export interface coordinateArray {
    () : position[];
}

您所描述的是带有呼叫签名的类型。 ()表示“你可以用零参数给我打电话”,而不是“我就是这样”。编译器希望您像这样使用coordinateArray

var x: coordinateArray = /* something */;
var y = x(); // y: position[]