L.Class.include() 与 TypeScript 的等价物
Equivalent of L.Class.include() with TypeScript
在 JavaScript(使用 Leaflet)中,我可以使用 L.Class.include()
实现一些自定义功能,如文档中所写:
Including more functionality in an existing class with L.Class.include()
Adding new methods and options
Changing some methods
Using addInitHook to run extra constructor code.
这个有效:
L.Rectangle.include({
contains: function (markers: L.Marker[]) {
const markersContained: boolean[] = [];
markers.forEach(marker => {
console.log(marker);
markersContained.push(this.getBounds().contains(marker.getLatLng()));
})
return markersContained;
}
});
现在我正在尝试使用 TypeScript 在 Angular4 应用程序中实现相同的功能,但是 include()
函数似乎没有在 @types/leaflet
中键入
问题是我的代码在为 Leaflet.Draw
插件量身定制的 .ts
文件中,所以我必须以这种方式初始化文件:
declare const L: any;
import 'leaflet-draw/dist/leaflet.draw-src';
而不是常规的
import * as L from 'leaflet';
由于Leaflet.Draw
插件没有@types
,所以我无法导入常规的传单类型(否则,new L.Control.Draw()
会编译错误)。
这在编译时中断:
map.on(L.Draw.Event.CREATED, (geometry: L.LayerEvent) => {
const layer = geometry.layer;
drawnItems.addLayer(layer);
// Set an array containing all the markers
const markers = LeafletService.prototype.jsonToArray(layerGroup.getLayers());
// ===> Property 'contains' does not exist on type 'Layer'.
const result = geometry.layer.contains(markers);
console.log('result => ', result);
});
显然,如果我将几何类型设置为 any
,这会起作用,但我想尽可能使用 L.LayerEvent
类型,并且想知道如何使用 TypeScript正确使用 Leaflet include()
方法的语法 ?
TL;DR : 我必须使用 any
除非他们输入 Leaflet.Draw
...
好的所以最后很明显...
由于 Leaflet.Draw
没有类型,我必须 declare const L: any
以避免在将 Leaflet.Draw
插件与 Leaflet
集成时出现编译错误。
很明显,当我调用 L.Rectangle
时,由于 L 是 any
类型,我不可能使用 Leaflet
中的类型化 include()
方法(我确实在运行时使用实际方法,但我无法让 TypeScript 在编译时知道它)。
从 Leaflet.Draw
事件返回的几何图形不知道我添加的新 contains()
方法是合乎逻辑的,因为它没有链接到实际的 L.Rectangle
传单类型。
在 JavaScript(使用 Leaflet)中,我可以使用 L.Class.include()
实现一些自定义功能,如文档中所写:
Including more functionality in an existing class with L.Class.include() Adding new methods and options Changing some methods Using addInitHook to run extra constructor code.
这个有效:
L.Rectangle.include({
contains: function (markers: L.Marker[]) {
const markersContained: boolean[] = [];
markers.forEach(marker => {
console.log(marker);
markersContained.push(this.getBounds().contains(marker.getLatLng()));
})
return markersContained;
}
});
现在我正在尝试使用 TypeScript 在 Angular4 应用程序中实现相同的功能,但是 include()
函数似乎没有在 @types/leaflet
问题是我的代码在为 Leaflet.Draw
插件量身定制的 .ts
文件中,所以我必须以这种方式初始化文件:
declare const L: any;
import 'leaflet-draw/dist/leaflet.draw-src';
而不是常规的
import * as L from 'leaflet';
由于Leaflet.Draw
插件没有@types
,所以我无法导入常规的传单类型(否则,new L.Control.Draw()
会编译错误)。
这在编译时中断:
map.on(L.Draw.Event.CREATED, (geometry: L.LayerEvent) => {
const layer = geometry.layer;
drawnItems.addLayer(layer);
// Set an array containing all the markers
const markers = LeafletService.prototype.jsonToArray(layerGroup.getLayers());
// ===> Property 'contains' does not exist on type 'Layer'.
const result = geometry.layer.contains(markers);
console.log('result => ', result);
});
显然,如果我将几何类型设置为 any
,这会起作用,但我想尽可能使用 L.LayerEvent
类型,并且想知道如何使用 TypeScript正确使用 Leaflet include()
方法的语法 ?
TL;DR : 我必须使用 any
除非他们输入 Leaflet.Draw
...
好的所以最后很明显...
由于 Leaflet.Draw
没有类型,我必须 declare const L: any
以避免在将 Leaflet.Draw
插件与 Leaflet
集成时出现编译错误。
很明显,当我调用 L.Rectangle
时,由于 L 是 any
类型,我不可能使用 Leaflet
中的类型化 include()
方法(我确实在运行时使用实际方法,但我无法让 TypeScript 在编译时知道它)。
从 Leaflet.Draw
事件返回的几何图形不知道我添加的新 contains()
方法是合乎逻辑的,因为它没有链接到实际的 L.Rectangle
传单类型。