Эквивалент L.Class.include() с TypeScript

В JavaScript (с Leaflet) я мог бы реализовать некоторые пользовательские функции, используя 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 с помощью TypeScript, но функция 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()?


person Alex Beugnet    schedule 15.09.2017    source источник


Ответы (1)


TL;DR : я должен использовать any, если они не вводят Leaflet.Draw...

Хорошо, так что это было совершенно очевидно в конце...

Из-за того, что Leaflet.Draw не имеет типов, я должен declare const L: any избежать ошибок компиляции при интеграции плагина Leaflet.Draw с Leaflet.

Поэтому очевидно, что когда я вызываю L.Rectangle, поскольку L имеет тип any, я не могу использовать типизированный метод include() из Leaflet (я использую фактический метод во время выполнения, но я не могу сообщить TypeScript о нем во время компиляции). ).

Вполне логично, что геометрия, возвращенная из события Leaflet.Draw, не знает о новом методе contains(), который я добавил, поскольку он не связан с фактическим типом листовки L.Rectangle.

person Alex Beugnet    schedule 15.09.2017