Свойство ‘_popup’ не существует для типа ‘Marker’

#html #angular #typescript #leaflet #leaflet.markercluster

#HTML #угловой #typescript #листовка #leaflet.markercluster

Вопрос:

Итак, я создаю карту, используя angular и leaflet. Одна из вещей, которые я использую, — это leaflet.markercluster. Когда я нажимаю на кластер, я хочу, чтобы всплывающее содержимое случайного маркера кластера было где-то записано. Чтобы получить доступ к всплывающему содержимому некоторого случайного кластера, я сделал это:

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

и получил сообщение об ошибке: свойство ‘_popup’ не существует для типа ‘Marker’.

Но дело в том, что если я выполняю ng serve в первый раз, он не компилируется, но если я что-то изменю и сохраню все, он успешно компилируется с ошибками, и я могу видеть содержимое всплывающего окна.

Кроме того, если я выполняю console.log(cluster.getAllChildMarkers()[0]) и проверяю элемент на веб-странице, я получаю обычный консольный журнал маркера с latlng и всеми другими атрибутами, включая _popup .

Кто-нибудь знает, почему typescript / vscode регистрирует ошибку, но html console видит ее нормально?

Ответ №1:

Поскольку TypeScript более строгий, чем JavaScript, он предупреждает вас о потенциальных проблемах, которые на самом деле могут отлично работать после переноса в JS.

В данном конкретном случае это просто связано с тем, что псевдоприватные свойства («_popup» следует обычному соглашению библиотек JS об использовании префикса подчеркивания _ для обозначения псевдоприватных членов) не объявляются в типах TS листовки, поскольку вы не должны их использовать.

Но, конечно, это все еще технически допустимо в JS, поэтому вы можете сообщить компилятору TS «Я знаю, что я делаю», используя директиву //@ts-ignore comment чуть выше этой строки.

Или дольше, но намного лучше, поскольку вы можете оставаться под наблюдением TS: используйте фактический API листовки для достижения того, что вы делаете:

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