我创建了一个这样的模块:
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数据,服务器将无法回答。
答案 0 :(得分:2)
Geistics仍然是TypeScript的open work item。因此,虽然您可以position
,coordinateArray
和polygonRings
扩展数组以了解推送方法的存在,但类型仍然永远不会匹配。 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[]