@JsType
и соответствующие аннотации не создают оболочки, которые пытаются понять, что вы имели в виду , но на самом деле они генерируют код JS, который максимально соответствует тому, что вы сделали делай. Это означает, что если вы говорите: «Я создаю новый не родной тип JS, и у него будет такой конструктор, как этот», GWT скажет «хорошо» и сделает это. И результатом будет тип в JS с конструктором, но объекты, созданные не с помощью этого точного конструктора по определению, не относятся к этому типу, и вы можете получить ошибку, если попытаетесь обработать их так, как если бы они были.
Вместо этого ваш FeatureCollection
почти наверняка должен быть нативным типом, вероятно, простым Object
в пространстве имен JsPackage.GLOBAL
, и вместо конструктора у вас должен быть фабричный метод.
В качестве альтернативы, вы можете рискнуть, используя Js.uncheckedCast
, чтобы сказать: «Поверьте мне, этот объект более или менее правильной формы (хотя это может быть неправильный тип), просто используйте его, как если бы он был того же типа», и до тех пор, пока у GWT нет оснований для дальнейшей проверки типов, это позволит вам сойти с рук. Это, вероятно, подходит для использования в вашем собственном коде приложения, но с очень четкими заметками о том, что вы делаете и когда это пойдет не так.
Дополнительное примечание - как правило, если у вас есть геттеры и сеттеры в не-нативном JsType
, вы должны пометить их как @JsProperty
вместо того, чтобы отмечать приватное поле, так что - если вы сделали поле финальным, другой JS мог бы назначить его позже, в любом случае, если вы заставите получатель или установщик выполнить некоторую проверку или кэширование, любой доступ из JS пропустит это. Помните также, что если типом является JsType
, он автоматически экспортирует все свои открытые члены, поэтому вы можете достичь того же самого, просто удалив JsProperty
и метод получения и сделав поле открытым.