В 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()
?