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是从何而来的?再多的强制转换或更改类型信息也不会使该方法出现在运行时。