Javascript 由于接口类型奇怪,无法解析push方法

Javascript 由于接口类型奇怪,无法解析push方法,javascript,json,typescript,geojson,Javascript,Json,Typescript,Geojson,我创建了如下模块: module GeoJSON { export interface position { (): number[]; } export interface coordinateArray { () : position[]; } export interface polygonRings { (): position[][]; } export class G

我创建了如下模块:

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[];
    }
}
var x: coordinateArray = /* something */;
var y = x(); // y: position[]
当我使用它时,我会犯一个愚蠢的错误。
push
是一个未解决的方法

var lineString: GeoJSON.LineString = <GeoJSON.LineString> this._myGeometry;
lineString.coordinates.push(position);
如何使
push
在此处可见?我无法将
坐标的类型从
CoordinaryRay
更改为
position[]
,因为稍后
JSON.stringify
将返回不同的JSON数据,服务器将不会响应。

泛型仍然是一个用于类型脚本的选项。因此,虽然您可以使用
位置
坐标数组
多边形数组
扩展数组以了解推送方法的存在,但类型仍然不会匹配。lib.d.ts中的数组使用一个hacky_元素,在实现泛型之前,编译器会专门处理该元素

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

您的运行时问题几乎肯定是您从未正确构造
LineString
,因此
LineString.coordinates
未定义。不要强制转换为
行字符串
,而是将接口设置为类并设置构造函数中的所有成员。即:

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 });
泛型仍然是TypeScript的首选。因此,虽然您可以使用
位置
坐标数组
多边形数组
扩展数组以了解推送方法的存在,但类型仍然不会匹配。lib.d.ts中的数组使用一个hacky_元素,在实现泛型之前,编译器会专门处理该元素

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

您的运行时问题几乎肯定是您从未正确构造
LineString
,因此
LineString.coordinates
未定义。不要强制转换为
行字符串
,而是将接口设置为类并设置构造函数中的所有成员。即:

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 });

清楚地说,当你写这篇文章时:

export interface coordinateArray {
    () : position[];
}
您描述的是一个带有调用签名的类型。
()
的意思是“你可以用零参数调用我”,而不是“我就是这样”。编译器希望您像这样使用
Coordinatorray

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[];
    }
}
var x: coordinateArray = /* something */;
var y = x(); // y: position[]

清楚地说,当你写这篇文章时:

export interface coordinateArray {
    () : position[];
}
您描述的是一个带有调用签名的类型。
()
的意思是“你可以用零参数调用我”,而不是“我就是这样”。编译器希望您像这样使用
Coordinatorray

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[];
    }
}
var x: coordinateArray = /* something */;
var y = x(); // y: position[]

我的几何从何而来?再多的强制转换或更改类型信息也不会使该方法出现在运行时。myGeometry是从何而来的?再多的强制转换或更改类型信息也不会使该方法出现在运行时。