From cebaa546b7d5c1f87cc786ece0b8776fc91caed6 Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Fri, 6 Aug 2021 10:05:19 +0200 Subject: [PATCH 1/4] Feature.clone returns correct type. --- src/ol/Feature.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ol/Feature.js b/src/ol/Feature.js index 834e618fa1..45769cc4e7 100644 --- a/src/ol/Feature.js +++ b/src/ol/Feature.js @@ -144,17 +144,17 @@ class Feature extends BaseObject { /** * Clone this feature. If the original feature has a geometry it * is also cloned. The feature id is not set in the clone. - * @return {Feature} The clone. + * @return {Feature} The clone. * @api */ clone() { - const clone = new Feature( - this.hasProperties() ? this.getProperties() : null + const clone = /** @type {Feature} */ ( + new Feature(this.hasProperties() ? this.getProperties() : null) ); clone.setGeometryName(this.getGeometryName()); const geometry = this.getGeometry(); if (geometry) { - clone.setGeometry(geometry.clone()); + clone.setGeometry(/** @type {Geometry} */ (geometry.clone())); } const style = this.getStyle(); if (style) { From d7b443bf44354e5f024a949c8c475e525419dd7e Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Fri, 6 Aug 2021 10:06:02 +0200 Subject: [PATCH 2/4] Make constructor pick up geometry type from properties object. --- src/ol/Feature.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ol/Feature.js b/src/ol/Feature.js index 45769cc4e7..c41c99bd4a 100644 --- a/src/ol/Feature.js +++ b/src/ol/Feature.js @@ -22,6 +22,11 @@ import {listen, unlistenByKey} from './events.js'; * |'change:geometry', Return>} FeatureOnSignature */ +/*** + * @template Geometry + * @typedef {Object & { geometry?: Geometry }} ObjectWithGeometry + */ + /** * @classdesc * A vector object for geographic features with a geometry and other @@ -69,7 +74,7 @@ import {listen, unlistenByKey} from './events.js'; */ class Feature extends BaseObject { /** - * @param {Geometry|Object} [opt_geometryOrProperties] + * @param {Geometry|ObjectWithGeometry} [opt_geometryOrProperties] * You may pass a Geometry object directly, or an object literal containing * properties. If you pass an object literal, you may include a Geometry * associated with a `geometry` key. From d6e0eb75fab9b24139446b0932c345ad09c7f4b6 Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Fri, 6 Aug 2021 10:16:20 +0200 Subject: [PATCH 3/4] Use Source as default parameter for Layer. --- src/ol/Feature.js | 2 +- src/ol/PluggableMap.js | 4 ++-- src/ol/interaction/Select.js | 8 ++++---- src/ol/interaction/Translate.js | 8 ++++---- src/ol/renderer/Composite.js | 4 ++-- src/ol/renderer/Map.js | 4 ++-- src/ol/renderer/vector.js | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/ol/Feature.js b/src/ol/Feature.js index c41c99bd4a..42e2f46851 100644 --- a/src/ol/Feature.js +++ b/src/ol/Feature.js @@ -11,7 +11,7 @@ import {listen, unlistenByKey} from './events.js'; */ /** - * @typedef {Feature|import("./render/Feature.js").default} FeatureLike + * @typedef {Feature|import("./render/Feature.js").default} FeatureLike */ /*** diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index a7da6c0dde..1467959989 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -66,7 +66,7 @@ import {removeNode} from './dom.js'; /** * @typedef {Object} AtPixelOptions - * @property {undefined|function(import("./layer/Layer.js").default): boolean} [layerFilter] Layer filter + * @property {undefined|function(import("./layer/Layer.js").default): boolean} [layerFilter] Layer filter * function. The filter function will receive one argument, the * {@link module:ol/layer/Layer layer-candidate} and it should return a boolean value. * Only layers which are visible and for which this function returns `true` @@ -553,7 +553,7 @@ class PluggableMap extends BaseObject { * callback with each intersecting feature. Layers included in the detection can * be configured through the `layerFilter` option in `opt_options`. * @param {import("./pixel.js").Pixel} pixel Pixel. - * @param {function(import("./Feature.js").FeatureLike, import("./layer/Layer.js").default, import("./geom/SimpleGeometry.js").default): T} callback Feature callback. The callback will be + * @param {function(import("./Feature.js").FeatureLike, import("./layer/Layer.js").default, import("./geom/SimpleGeometry.js").default): T} callback Feature callback. The callback will be * called with two arguments. The first argument is one * {@link module:ol/Feature feature} or * {@link module:ol/render/Feature render feature} at the pixel, the second is diff --git a/src/ol/interaction/Select.js b/src/ol/interaction/Select.js index b688165fe6..f1f67baa4a 100644 --- a/src/ol/interaction/Select.js +++ b/src/ol/interaction/Select.js @@ -30,7 +30,7 @@ const SelectEventType = { * {@link module:ol/render/Feature} and an * {@link module:ol/layer/Layer} and returns `true` if the feature may be * selected or `false` otherwise. - * @typedef {function(import("../Feature.js").FeatureLike, import("../layer/Layer.js").default):boolean} FilterFunction + * @typedef {function(import("../Feature.js").FeatureLike, import("../layer/Layer.js").default):boolean} FilterFunction */ /** @@ -49,7 +49,7 @@ const SelectEventType = { * feature removes all from the selection. * See `toggle`, `add`, `remove` options for adding/removing extra features to/ * from the selection. - * @property {Array|function(import("../layer/Layer.js").default): boolean} [layers] + * @property {Array|function(import("../layer/Layer.js").default): boolean} [layers] * A list of layers from which features should be selected. Alternatively, a * filter function can be provided. The function will be called for each layer * in the map and should return `true` for layers that you want to be @@ -252,7 +252,7 @@ class Select extends Interaction { */ this.features_ = options.features || new Collection(); - /** @type {function(import("../layer/Layer.js").default): boolean} */ + /** @type {function(import("../layer/Layer.js").default): boolean} */ let layerFilter; if (options.layers) { if (typeof options.layers === 'function') { @@ -269,7 +269,7 @@ class Select extends Interaction { /** * @private - * @type {function(import("../layer/Layer.js").default): boolean} + * @type {function(import("../layer/Layer.js").default): boolean} */ this.layerFilter_ = layerFilter; diff --git a/src/ol/interaction/Translate.js b/src/ol/interaction/Translate.js index 3ef0dd610b..cabdb7b52e 100644 --- a/src/ol/interaction/Translate.js +++ b/src/ol/interaction/Translate.js @@ -38,7 +38,7 @@ const TranslateEventType = { * {@link module:ol/render/Feature} and an * {@link module:ol/layer/Layer} and returns `true` if the feature may be * translated or `false` otherwise. - * @typedef {function(import("../Feature.js").FeatureLike, import("../layer/Layer.js").default):boolean} FilterFunction + * @typedef {function(import("../Feature.js").FeatureLike, import("../layer/Layer.js").default):boolean} FilterFunction */ /** @@ -49,7 +49,7 @@ const TranslateEventType = { * Default is {@link module:ol/events/condition.always}. * @property {Collection} [features] Only features contained in this collection will be able to be translated. If * not specified, all features on the map will be able to be translated. - * @property {Array|function(import("../layer/Layer.js").default): boolean} [layers] A list of layers from which features should be + * @property {Array|function(import("../layer/Layer.js").default): boolean} [layers] A list of layers from which features should be * translated. Alternatively, a filter function can be provided. The * function will be called for each layer in the map and should return * `true` for layers that you want to be translatable. If the option is @@ -171,7 +171,7 @@ class Translate extends PointerInteraction { */ this.features_ = options.features !== undefined ? options.features : null; - /** @type {function(import("../layer/Layer.js").default): boolean} */ + /** @type {function(import("../layer/Layer.js").default): boolean} */ let layerFilter; if (options.layers) { if (typeof options.layers === 'function') { @@ -188,7 +188,7 @@ class Translate extends PointerInteraction { /** * @private - * @type {function(import("../layer/Layer.js").default): boolean} + * @type {function(import("../layer/Layer.js").default): boolean} */ this.layerFilter_ = layerFilter; diff --git a/src/ol/renderer/Composite.js b/src/ol/renderer/Composite.js index f2a60c9afa..69d9ec3c5a 100644 --- a/src/ol/renderer/Composite.js +++ b/src/ol/renderer/Composite.js @@ -153,9 +153,9 @@ class CompositeMapRenderer extends MapRenderer { * @param {import("../pixel.js").Pixel} pixel Pixel. * @param {import("../PluggableMap.js").FrameState} frameState FrameState. * @param {number} hitTolerance Hit tolerance in pixels. - * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer + * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer * callback. - * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter + * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter * function, only layers which are visible and for which this function * returns `true` will be tested for features. By default, all visible * layers will be tested. diff --git a/src/ol/renderer/Map.js b/src/ol/renderer/Map.js index d663541cd9..c923898801 100644 --- a/src/ol/renderer/Map.js +++ b/src/ol/renderer/Map.js @@ -175,9 +175,9 @@ class MapRenderer extends Disposable { * @param {import("../pixel.js").Pixel} pixel Pixel. * @param {import("../PluggableMap.js").FrameState} frameState FrameState. * @param {number} hitTolerance Hit tolerance in pixels. - * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer + * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer * callback. - * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter + * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter * function, only layers which are visible and for which this function * returns `true` will be tested for features. By default, all visible * layers will be tested. diff --git a/src/ol/renderer/vector.js b/src/ol/renderer/vector.js index db4929d430..32d2e99ba7 100644 --- a/src/ol/renderer/vector.js +++ b/src/ol/renderer/vector.js @@ -13,7 +13,7 @@ import {getUid} from '../util.js'; * unmanaged layers. The third is the {@link module:ol/geom/SimpleGeometry} of the feature. For features * with a GeometryCollection geometry, it will be the first detected geometry from the collection. * @template T - * @typedef {function(import("../Feature.js").FeatureLike, import("../layer/Layer.js").default, import("../geom/SimpleGeometry.js").default): T} FeatureCallback + * @typedef {function(import("../Feature.js").FeatureLike, import("../layer/Layer.js").default, import("../geom/SimpleGeometry.js").default): T} FeatureCallback */ /** From f636d68ccefd3c40a191b1cb9eb029234be7c96c Mon Sep 17 00:00:00 2001 From: Simon Seyock Date: Fri, 6 Aug 2021 11:07:24 +0200 Subject: [PATCH 4/4] Fix typing errors. --- src/ol/PluggableMap.js | 2 +- src/ol/format/KML.js | 12 ++++++++++-- src/ol/interaction/Modify.js | 6 +++++- src/ol/renderer/Map.js | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/ol/PluggableMap.js b/src/ol/PluggableMap.js index 1467959989..8948e609e4 100644 --- a/src/ol/PluggableMap.js +++ b/src/ol/PluggableMap.js @@ -563,7 +563,7 @@ class PluggableMap extends BaseObject { * @param {AtPixelOptions} [opt_options] Optional options. * @return {T|undefined} Callback result, i.e. the return value of last * callback execution, or the first truthy callback return value. - * @template S,T + * @template T * @api */ forEachFeatureAtPixel(pixel, callback, opt_options) { diff --git a/src/ol/format/KML.js b/src/ol/format/KML.js index 057ef73815..8e86545c71 100644 --- a/src/ol/format/KML.js +++ b/src/ol/format/KML.js @@ -1882,8 +1882,12 @@ function readStyle(node, objectStack) { const geometry = feature.getGeometry(); const type = geometry.getType(); if (type === GeometryType.GEOMETRY_COLLECTION) { + const collection = + /** @type {import("../geom/GeometryCollection").default} */ ( + geometry + ); return new GeometryCollection( - geometry + collection .getGeometriesArrayRecursive() .filter(function (geometry) { const type = geometry.getType(); @@ -1911,8 +1915,12 @@ function readStyle(node, objectStack) { const geometry = feature.getGeometry(); const type = geometry.getType(); if (type === GeometryType.GEOMETRY_COLLECTION) { + const collection = + /** @type {import("../geom/GeometryCollection").default} */ ( + geometry + ); return new GeometryCollection( - geometry + collection .getGeometriesArrayRecursive() .filter(function (geometry) { const type = geometry.getType(); diff --git a/src/ol/interaction/Modify.js b/src/ol/interaction/Modify.js index 2b5be78e81..8b0bbe1bcb 100644 --- a/src/ol/interaction/Modify.js +++ b/src/ol/interaction/Modify.js @@ -1167,7 +1167,11 @@ class Modify extends PointerInteraction { map.forEachFeatureAtPixel( pixel, (feature, layer, geometry) => { - geometry = geometry || feature.getGeometry(); + geometry = + geometry || + /** @type {import("../geom/SimpleGeometry").default} */ ( + feature.getGeometry() + ); if ( geometry.getType() === GeometryType.POINT && includes(this.features_.getArray(), feature) diff --git a/src/ol/renderer/Map.js b/src/ol/renderer/Map.js index c923898801..8252ea2e85 100644 --- a/src/ol/renderer/Map.js +++ b/src/ol/renderer/Map.js @@ -175,7 +175,7 @@ class MapRenderer extends Disposable { * @param {import("../pixel.js").Pixel} pixel Pixel. * @param {import("../PluggableMap.js").FrameState} frameState FrameState. * @param {number} hitTolerance Hit tolerance in pixels. - * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer + * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer * callback. * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter * function, only layers which are visible and for which this function