gpt4 book ai didi

javascript - 由于奇怪的类型接口(interface),未解决推送方法

转载 作者:行者123 更新时间:2023-11-28 20:35:21 25 4
gpt4 key购买 nike

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

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 在这里可见?我无法将坐标的类型从cooperativeArray更改为position[],因为稍后JSON.stringify将返回不同的 JSON 数据,服务器不会响应。

最佳答案

泛型仍然是 open work item对于 typescript 。因此,虽然您可以使用 positioncoordinateArraypolygonRings 扩展 Array 来知道 Push 方法存在,但类型仍然永远不会匹配。 lib.d.ts 中的数组使用 hacky _element,该元素由编译器专门处理,直到实现泛型为止。

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

您的运行时问题几乎可以肯定是您从未正确构造LineString,因此lineString.coordinates未定义。不要将接口(interface)强制转换为 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 });

关于javascript - 由于奇怪的类型接口(interface),未解决推送方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15550859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com