类型“Marker<any>”上不存在属性“_popup”

问题描述

所以,我正在使用 angular 和传单构建地图。我使用的其中一件事是leaflet.markercluster。当我单击集群时,我希望将集群的随机标记的弹出内容写入某处。为了访问一些随机集群的弹出内容,我这样做了:

 cluster.getAllChildMarkers()[0]._popup._content

并得到一个错误属性“_popup”在类型“Marker”上不存在。

但问题是,如果我第一次 ng serve 编译失败,但是如果我更改任何内容并保存所有内容,它会成功编译并显示错误,我可以看到弹出窗口的内容.

此外,如果我执行 console.log(cluster.getAllChildMarkers()[0]) 并检查网页上的元素,我会得到带有 latlng 和所有其他属性标记的常规控制台日志,包括_popup。

有谁知道为什么 typescript/vscode 会报错,但是 html 控制台却能正常看到?

解决方法

因为 TypeScript 比 JavaScript 更严格,所以它会警告您潜在的问题,一旦在 JS 中转译,这些问题实际上可能会正常工作。

在这种特定情况下,这仅仅是由于伪私有属性(“_popup”遵循使用下划线 _ 前缀来表示伪私有成员的常用 JS 库约定)没有在 TS 类型的 Leaflet 上声明,因为您不会使用它们。

当然,这在 JS 中在技术上仍然有效,因此您可以使用该行上方的 //@ts-ignore 注释指令告诉 TS 编译器“我知道我在做什么”。

或者更长但更好,因为您可以保持在 TS 监视之下:使用实际的 Leaflet API 来实现您正在做的事情:

cluster.getAllChildMarkers()[0].getPopup()?.getContent()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...