0

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

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在这里显示?我无法更改coordinatesfrom coordinateArrayto的类型position[],因为稍后JSON.stringify将返回不同的 JSON 数据并且服务器不会响应。

4

2 回答 2

2

泛型仍然是 TypeScript 的开放工作项。因此,虽然您可以拥有position,coordinateArraypolygonRings扩展 Array 以知道 push 方法存在,但类型仍然永远不会匹配。lib.d.ts 中的数组使用了一个 hacky _element,它由编译器专门处理,直到实现泛型。

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

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

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 });
于 2013-03-21T15:48:16.577 回答
1

要清楚,当你写这个时:

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

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

var x: coordinateArray = /* something */;
var y = x(); // y: position[]
于 2013-03-21T15:52:11.250 回答