与打字稿
在JavaScript(含传单),书面文档中我可以实现使用L.Class.include()
一些自定义functionnalities等效L.Class.include()的:与打字稿
包括与L-现有类更多的功能.Class.include() 添加新的方法和选项 更改某些方法 使用addInitHook运行额外的构造函数代码。
这工作:
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;
}
});
现在我想要实现相同与打字稿的Angular4应用程序,但include()
功能似乎并没有在@types/leaflet
问题是我的代码是在.ts
文件中为Leaflet.Draw
插件量身定做的,所以我不得不用这种方法初始化文件:
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()
方法(我在运行时使用的实际方法,但我不能让打字稿知道它用于编译时间)。
从Leaflet.Draw
事件返回的几何体不知道我添加的新的方法是合乎逻辑的,因为它没有链接到实际的L.Rectangle
传单类型。