2017-09-15 197 views
1

在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()方法?

回答

0

TL; DR:我必须使用any除非他们键入Leaflet.Draw ...

好了,所以它是在年底相当明显...

因为Leaflet.Draw它没有类型,我必须declare const L: any,以便在将Leaflet.Draw插件与Leaflet集成时避免编译错误。

所以,很显然,当我打电话L.Rectangle,因为L是any型的,我不可能使用来自Leaflet类型化include()方法(我在运行时使用的实际方法,但我不能让打字稿知道它用于编译时间)。

Leaflet.Draw事件返回的几何体不知道我添加的新的方法是合乎逻辑的,因为它没有链接到实际的L.Rectangle传单类型。