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 传单类型。