由于奇怪的类型接口,无法解析的推送方法
Unresolved push method because of strange type interfacing
我创建了一个这样的模块:
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数据,服务器不会回答。
泛型对TypeScript来说仍然是一个开放的工作项。因此,虽然您可以让position
、coordinateArray
和polygonRings
扩展Array来知道push方法存在,但类型仍然无法匹配。lib.d.ts中的Array使用了一个hacky _element,在泛型实现之前由编译器专门处理。
您可以将Array的定义复制到position
中,并将_element的所有实例替换为number,但这感觉真的很难看。我要么用数字[]替换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 });
要清楚,当你写这个:
export interface coordinateArray {
() : position[];
}
您所描述的是具有呼叫签名的类型。()
的意思是"你可以用零参数调用我",而不是"这就是我"。编译器期望您像这样使用coordinateArray
:
var x: coordinateArray = /* something */;
var y = x(); // y: position[]
相关文章:
- toBoolean方法类似于toString
- 在angularjs中将html项插入到现有模板HTML中有什么奇怪的方法
- E4X中是否有一种方法可以将基元数据类型的XMLList转换为类似于Array.join()的Array
- 使悬停菜单适用于移动设备的最佳实践方法是什么?
- 相当于Python's values()字典方法
- 使用Math.round的奇怪方法结果
- setTimeout方法的工作原理很奇怪
- 使用lodash'扩展JS对象实例;s的extend方法会导致奇怪的结果
- 通用化用于切换禁用属性的代码的最佳方法
- Emberjs - 基于控制器属性进行过滤的奇怪解决方法
- 在调用依赖于它的方法时设置 javascript 对象属性
- JavaScript 相当于 jQuery 的扩展方法
- 有没有一种纯粹的Javascript方法可以将一个函数应用于多个元素的事件
- javascript调用方法的奇怪行为
- ajax请求时请求方法的奇怪行为
- 插件内部jquery数据方法的奇怪行为
- setInterval()方法行为奇怪
- . toggleclass()方法的奇怪行为
- Javascript中getElementById()和.split()方法的奇怪行为
- NodeJS异步库并行方法的奇怪行为