2017-03-06 121 views
1

我试图实现一个带有小册子和其他小册子插件的地图组件。问题是由于某些原因,其他插件无法从TypeScript中使用。Property'Draw'在类型'typeof Control'上不存在

例如我无法编译瓣叶战平插件代码,并得到错误:

Property 'Draw' does not exist on type 'typeof Control'

mapbox.component.ts

import { DataService } from "../data-service.service"; 
import { Component, OnInit } from '@angular/core'; 


import * as $ from 'jquery'; 
/// <reference types="leaflet" /> 
/// <reference types="leaflet-draw" /> 

declare var require: any 


@Component({ 
    selector: 'app-mapbox', 
    templateUrl: './mapbox.component.html', 
    styleUrls: ['./mapbox.component.css'] 
}) 

export class MapboxComponent implements OnInit { 

    constructor(private dataService: DataService) { } 
    // helper flags 
    map: L.Map = null; 
    aggreagte: boolean = false; 

    ngOnInit() { 
     // Prepare map 
     this.map = L.map('resultmap').setView([51.505, -0.09], 1); 
     // 
     L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', { 
      attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>', 
      maxZoom: 18, 
      id: 'mapbox.streets', 
      accessToken: '...' 
     }).addTo(this.map); 

     var drawnItems = L.featureGroup(); 
     this.map.addLayer(drawnItems); 
     var control = new L.Control.Draw(); 
     ... 

角cli.json

"apps": [ 
    { 
     "root": "src", 
     "outDir": "dist", 
     "assets": [ 
     "assets", 
     "favicon.ico" 
     ], 
     "index": "index.html", 
     "main": "main.ts", 
     "polyfills": "polyfills.ts", 
     "test": "test.ts", 
     "tsconfig": "tsconfig.json", 
     "prefix": "app", 
     "styles": [ 
     "styles.css", 
     "../node_modules/leaflet/dist/leaflet.css", 
     "../node_modules/leaflet-markercluster/MarkerCluster.css", 
     "../node_modules/leaflet-draw/dist/leaflet.draw.css" 
     ], 
     "scripts": [ 
     "../node_modules/jquery/dist/jquery.min.js", 
     "../node_modules/leaflet/dist/leaflet.js", 
     "../node_modules/leaflet-markercluster/leaflet.markercluster.js", 
     "../node_modules/leaflet-draw/dist/leaflet.draw.js", 
     "../node_modules/chart.js/dist/Chart.bundle.min.js" 
     ], 
     "environments": { 
     "source": "environments/environment.ts", 
     "dev": "environments/environment.ts", 
     "prod": "environments/environment.prod.ts" 
     } 
    } 
    ] 
... 

tsconfig.json

"compilerOptions": { 
    "declaration": false, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "module": "commonjs", 
    "moduleResolution": "node", 
    "outDir": "../dist/out-tsc-e2e", 
    "sourceMap": true, 
    "target": "es5", 
    "files":[ 
     "../node_modules/@types/leaflet-draw/index.d.ts" 
    ], 
    "typeRoots": [ 
     "../node_modules/@types" 
    ], 
    "types":[ 
     "jquery", 
     "leaflet", 
     "leaflet-draw", 
     "leaflet-markercluster" 
    ] 
    } 

回答

1

我解决了问题,通过导入瓣叶画

import 'leaflet-draw'; 

不知道为什么它没有被tsconfig进口,但耶它的作品!

+1

这是因为您正在导入类型定义文件。这不会编译成实际的JS,但只是一个工具,所以你可以编码类型安全 – PierreDuc

+0

@PierreDuc哦。任何参考为进一步阅读?我想更好地理解它是如何工作的。我为leaflet-markercluster尝试了相同的技巧 - 没有运气。 – aclokay

+2

@aclokay Google _Angular_和_TypeScript_关系。应该有足够的材料来了解您拥有的问题。对于初学者:https://github.com/angular/angular-cli/wiki/stories-third-party-lib – Yuri

1

感谢@aclokay的洞察力。我会通过添加你完成这个答案,你也忘了改变标准的传单导入。例如:

// import * as L from 'leaflet'; 
// --> Doesn't work : Property 'Draw' does not exist on type 'typeof Control'. 
declare const L: any; // --> Works 
import 'leaflet-draw'; 

export function drawPlugin(map: any) { 
    const drawnItems = L.featureGroup().addTo(map); 

    const drawControl = new L.Control.Draw({ 
    edit: { 
     featureGroup: drawnItems, 
    }, 
    draw: { 
     polygon: false, 
     polyline: false, 
     marker: false, 
     circlemarker: false 
    } 
    }); 
    map.addControl(drawControl); 

    map.on(L.Draw.Event.CREATED, function (event) { 
    const layer = event.layer; 

    drawnItems.addLayer(layer); 
    }); 
} 
+0

为了更好地理解,使用Angular-CLI和传单库及其插件的完整示例可以在这里找到:https://github.com/consbio/Leaflet.ZoomBox/issues/15 –

相关问题