1

In JavaScript (mit Prospekt), habe ich einige benutzerdefinierten functionnalities L.Class.include() in der Dokumentation, wie geschrieben mit implementieren könnte: mit LEquivalent von L.Class.include() mit Typoskript

Einschließlich mehr Funktionalität in einer vorhandenen Klasse .Class.include() Hinzufügen neuer Methoden und Optionen Ändern einiger Methoden Verwenden von addInitHook, um zusätzlichen Konstruktorcode auszuführen.

Dies funktioniert:

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; 
    } 
    }); 

Nun Ich versuche, das gleiche in einer Angular4 Anwendung mit Typoskript zu implementieren, aber die include() Funktion scheint nicht in den @types/leaflet

typisierten werden

Die Sache ist, dass mein Code in einer .ts Datei ist, die für Leaflet.Draw Plugin zugeschnitten ist, so musste ich die Datei auf diese Weise initialisieren:

declare const L: any; 
import 'leaflet-draw/dist/leaflet.draw-src'; 

statt den regulären

import * as L from 'leaflet'; 

aufgrund der Tatsache, dass die Leaflet.Draw Plugin keine @types hat, daher kann ich nicht die regulären Faltblatt Typen importieren (Sonst new L.Control.Draw() würde einen Übersetzungsfehler machen).

Dies bricht bei der Kompilierung:

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); 
    }); 

und natürlich, das funktioniert, wenn ich meinen Geometrietyp als any gesetzt, aber ich mag den L.LayerEvent Typen verwenden, wenn möglich, und will wissen, Wie könnte ich die TypeScript-Syntax verwenden, um die Methode Leaflet include() korrekt zu verwenden?

Antwort

0

TL; DR: Ich habe any zu verwenden, es sei denn, sie Leaflet.Draw geben ...

Okay, so es ganz offensichtlich am Ende ...

Wegen Leaflet.Draw war, die keine Typen hat, Ich muss declare const L: any kompilieren Fehler bei der Integration der Leaflet.Draw Plugin mit Leaflet zu vermeiden.

So offensichtlich, wenn ich L.Rectangle nennen, da L vom Typ any, kann ich möglicherweise nicht die typisierte include() Methode von Leaflet verwenden (ich benutze tun, um die eigentliche Methode zur Laufzeit, aber ich kann nicht machen Typoskript bewusst es für die Kompilierungszeit).

Es ist nur logisch, dass die Geometrie von dem Leaflet.Draw Ereignisse zurück nicht über die neue Methode weiß, dass ich hinzugefügt, da es nicht auf den tatsächlichen L.Rectangle Faltblatt Typen verknüpft ist.